我的应用中有这个视图:
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, })
我想将此转换为基于类的视图,我相信对我来说“更有条理”......
“否则: form = form_class()“
我在没有代码的情况下尝试,我的表格更新完美。
如果我忽略了某些事情,请提前道歉,感谢您的评价!答案 0 :(得分:1)
由于您有一个显示表单的视图,并且在错误时重新显示包含验证错误的表单,并在成功时重定向到新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
:定义要使用的表单类
template_name
:定义用于显示表单的模板
success_url
:定义表单有效时使用的url。
当表单在form_valid()
函数内有效时,您可以将代码的所有逻辑放在执行中。执行完所有操作后,请致电super()
,重定向到您班级中定义的success_url
。
此外,当您构建要传递给电子邮件模板的上下文时,您可以使用form.cleaned_data
字典。您用于构建上下文字典的所有键与cleaned_data
字典中除form_content
键之外的字典相同。因此,我刚刚使用了表单cleaned_data
字典,并在form_content
字典中添加了一个额外的密钥context_dict
,然后将其用于电子邮件模板中进行渲染。