将我的 def 视图转换为基于 class 的视图
Convert my def view to class based view
我的应用程序中有这个视图:
def contact(request):
form_class = ContactForm
if request.method == 'POST':
form = form_class(data=request.POST)
if form.is_valid():
contact_name = form.cleaned_data['contact_name']
contact_email = form.cleaned_data['contact_email']
contact_website = form.cleaned_data['contact_website']
contact_subject = form.cleaned_data['contact_subject']
form_content = form.cleaned_data['content']
template = get_template('contact/contact_template.txt')
context = Context({'contact_name': contact_name,
'contact_email': contact_email,
'contact_website': contact_website,
'contact_subject': contact_subject,
'form_content': form_content, })
content = template.render(context)
email = EmailMessage(
"New contact form submission",
content,
"www.inexistente.com" + '<support@inexistente.com>',
['mymail@gmail.com'],
headers={'Reply-To': contact_email}
)
email.send()
return redirect('/')
return render(request, 'contact/contact.html', {'form': form_class, })
我想将其转换为基于 class 的视图,我认为这对我来说是 "more organized"...
- 要使用什么通用 Django 视图?
- 您认为建议这样做吗?
- 在视图中,是否建议在最后使用此代码更新表格,以防不通过?
"其他:
表格 = form_class()"
我在没有那个代码的情况下尝试过,我的表格完美地更新了自己。
如有遗漏请提前致歉,欢迎大家投稿,感谢评价!
由于您有一个显示表单的视图,该视图会在出错时重新显示带有验证错误的表单,并在成功时重定向到新的 URL,因此您可以使用 FormView
通用视图。
您的 FBV 代码已转换为 CBV:
from django.views.generic import FormView
class Contact(FormView):
form_class = ContactForm # Form class to be used
template_name = 'contact/contact.html' # Template to be used
success_url = '/' # Redirect to this url when form is valid
def form_valid(self, form):
template = get_template('contact/contact_template.txt')
context_dict = form.cleaned_data
context_dict['form_content'] = form.cleaned_data['content']
context = Context(context_dict)
content = template.render(context)
email = EmailMessage(
"New contact form submission",
content,
"www.inexistente.com" + '<support@inexistente.com>',
['mymail@gmail.com'],
headers={'Reply-To': contact_email}
)
email.send()
return super(Contact, self).form_valid(form)
这里,
form_class
:定义要使用的形式class。
template_name
: 定义用于显示表单的模板。
success_url
:定义表单有效时使用的url。
您可以将表单有效时要执行的代码的所有逻辑放在form_valid()
函数中。执行完所有操作后,调用 super()
重定向到 class.
中定义的 success_url
此外,当您构建要传递给电子邮件模板的上下文时,您可以使用 form.cleaned_data
字典。除了 form_content
键外,您用于构建上下文字典的所有键都与表单的 cleaned_data
字典中的键相同。所以,我刚刚使用了表单的 cleaned_data
字典,并在 context_dict
字典中添加了一个额外的键 form_content
,然后将在电子邮件模板中用于呈现。
我的应用程序中有这个视图:
def contact(request):
form_class = ContactForm
if request.method == 'POST':
form = form_class(data=request.POST)
if form.is_valid():
contact_name = form.cleaned_data['contact_name']
contact_email = form.cleaned_data['contact_email']
contact_website = form.cleaned_data['contact_website']
contact_subject = form.cleaned_data['contact_subject']
form_content = form.cleaned_data['content']
template = get_template('contact/contact_template.txt')
context = Context({'contact_name': contact_name,
'contact_email': contact_email,
'contact_website': contact_website,
'contact_subject': contact_subject,
'form_content': form_content, })
content = template.render(context)
email = EmailMessage(
"New contact form submission",
content,
"www.inexistente.com" + '<support@inexistente.com>',
['mymail@gmail.com'],
headers={'Reply-To': contact_email}
)
email.send()
return redirect('/')
return render(request, 'contact/contact.html', {'form': form_class, })
我想将其转换为基于 class 的视图,我认为这对我来说是 "more organized"...
- 要使用什么通用 Django 视图?
- 您认为建议这样做吗?
- 在视图中,是否建议在最后使用此代码更新表格,以防不通过?
"其他: 表格 = form_class()"
我在没有那个代码的情况下尝试过,我的表格完美地更新了自己。
如有遗漏请提前致歉,欢迎大家投稿,感谢评价!
由于您有一个显示表单的视图,该视图会在出错时重新显示带有验证错误的表单,并在成功时重定向到新的 URL,因此您可以使用 FormView
通用视图。
您的 FBV 代码已转换为 CBV:
from django.views.generic import FormView
class Contact(FormView):
form_class = ContactForm # Form class to be used
template_name = 'contact/contact.html' # Template to be used
success_url = '/' # Redirect to this url when form is valid
def form_valid(self, form):
template = get_template('contact/contact_template.txt')
context_dict = form.cleaned_data
context_dict['form_content'] = form.cleaned_data['content']
context = Context(context_dict)
content = template.render(context)
email = EmailMessage(
"New contact form submission",
content,
"www.inexistente.com" + '<support@inexistente.com>',
['mymail@gmail.com'],
headers={'Reply-To': contact_email}
)
email.send()
return super(Contact, self).form_valid(form)
这里,
form_class
:定义要使用的形式class。
template_name
: 定义用于显示表单的模板。
success_url
:定义表单有效时使用的url。
您可以将表单有效时要执行的代码的所有逻辑放在form_valid()
函数中。执行完所有操作后,调用 super()
重定向到 class.
success_url
此外,当您构建要传递给电子邮件模板的上下文时,您可以使用 form.cleaned_data
字典。除了 form_content
键外,您用于构建上下文字典的所有键都与表单的 cleaned_data
字典中的键相同。所以,我刚刚使用了表单的 cleaned_data
字典,并在 context_dict
字典中添加了一个额外的键 form_content
,然后将在电子邮件模板中用于呈现。