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_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))
Run Code Online (Sandbox Code Playgroud)
或者,您可以根据每种类型的请求覆盖post,get或put方法和处理表单.
对于复杂的场景,您确实应该考虑重写表单类中涉及验证/清理过程的各种方法。该类BaseForm定义了一个_post_clean()没有任何行为的方法,该方法特别适合被重写。正确覆盖_clean()也非常简单,如果您想在clean()调用之前执行某些操作,您也可以这样做。
阅读源代码django.forms将使您更清楚地了解表单的工作原理,并发现适合您需求的正确模式。
| 归档时间: |
|
| 查看次数: |
3112 次 |
| 最近记录: |