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,
    })
这在简单的情况下很好,但如果您的应用程序逻辑变得更复杂,则很容易陷入复杂的嵌套IF语句.
任何人都可以分享他们自己的清洁方法,避免嵌套的IF和逻辑依赖于落空情况?
我对那些不依赖其他第三方应用程序的答案特别感兴趣.
Der*_*lds 12
其中一个基于类的视图是FormView(文档).你要关注的两个主要方法是form_valid和form_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))
或者,您可以根据每种类型的请求覆盖post,get或put方法和处理表单.
对于复杂的场景,您确实应该考虑重写表单类中涉及验证/清理过程的各种方法。该类BaseForm定义了一个_post_clean()没有任何行为的方法,该方法特别适合被重写。正确覆盖_clean()也非常简单,如果您想在clean()调用之前执行某些操作,您也可以这样做。
阅读源代码django.forms将使您更清楚地了解表单的工作原理,并发现适合您需求的正确模式。
| 归档时间: | 
 | 
| 查看次数: | 3112 次 | 
| 最近记录: |