将我的def视图转换为基于类的视图

时间:2015-07-04 12:38:58

标签: python django django-views

我的应用中有这个视图:

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, })

我想将此转换为基于类的视图,我相信对我来说“更有条理”......

  • 使用什么通用Django视图?
  • 您认为建议这样做吗?
  • 在视图中,建议在最后使用此代码更新表单以防未通过?

“否则:         form = form_class()“

我在没有代码的情况下尝试,我的表格更新完美。

如果我忽略了某些事情,请提前道歉,感谢您的评价!

1 个答案:

答案 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,然后将其用于电子邮件模板中进行渲染。