Django形式逻辑的更好模式?

And*_*ker 9 django django-forms

因此,Django表单的视图逻辑的标准模式是:

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })
Run Code Online (Sandbox Code Playgroud)

这在简单的情况下很好,但如果您的应用程序逻辑变得更复杂,则很容易陷入复杂的嵌套IF语句.

任何人都可以分享他们自己的清洁方法,避免嵌套的IF和逻辑依赖于落空情况?

我对那些不依赖其他第三方应用程序的答案特别感兴趣.

Der*_*lds 12

其中一个基于类的视图是FormView(文档).你要关注的两个主要方法是form_validform_invalid.

from django.views.generic import FormView

from myapp.forms import MyForm

class MyView(FormView):

    template_name = 'edit_something.html'
    form_class = MyForm
    success_url = '/success/' # you should use `reverse`, but let's stay focused.

    def form_valid(self, form):
        """
        This is what's called when the form is valid.
        """

        return super(MyView, self).form_valid(form)

    def form_invalid(self, form):
        """
        This is what's called when the form is invalid.
        """

        return self.render_to_response(self.get_context_data(form=form))
Run Code Online (Sandbox Code Playgroud)

或者,您可以根据每种类型的请求覆盖post,getput方法和处理表单.

  • 你应该在你的`form_valid()`和`form_invalid()`的尾端使用`return super(MyView,self).form_valid(form)`而不是在你的版本中直接执行`返回HttpResponseRedirect()`.这将对数据进行操作,然后在其上运行Django的form_valid()版本(除了返回重定向之外什么都不做).这样,如果Django改变了form_valid()内部发生的事情,那么你还没有完全删除它. (2认同)

Imr*_*ran 2

对于复杂的场景,您确实应该考虑重写表单类中涉及验证/清理过程的各种方法。该类BaseForm定义了一个_post_clean()没有任何行为的方法,该方法特别适合被重写。正确覆盖_clean()也非常简单,如果您想在clean()调用之前执行某些操作,您也可以这样做。

阅读源代码django.forms将使您更清楚地了解表单的工作原理,并发现适合您需求的正确模式。