将我的 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"...

"其他: 表格 = 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,然后将在电子邮件模板中用于呈现。