[英]How do I raise a ValidationError (or do something similar) in views.py of my Django?
我正在使用Django表单。 我在模型层验证:
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 5:
raise forms.ValidationError("Headline must be more than 5 characters.")
return title
但是,我需要在views.py
验证一些内容。 例如......是用户最后一次发布超过一分钟的内容吗?
这种东西需要request.user,模型层无法获取。 所以,我必须在views.py中验证。 我如何在views.py中做一些事情来做到这一点?
raise forms.ValidationError("Headline must be more than 5 characters.")
我认为gruszczy的答案很好,但是如果你在涉及你认为只在视图中可用的变量的泛型验证之后,这里有另一种选择:将vars作为参数传递给表单并以表格的形式处理它们clean()方法。
这里的区别/优势在于您的视图更加简单,并且与表单内容相关的所有内容都可以在表单中进行。
例如:
# IN YOUR VIEW
# pass request.user as a keyword argument to the form
myform = MyForm(user=request.user)
# IN YOUR forms.py
# at the top:
from myapp.foo.bar import ok_to_post # some abstracted utility you write to rate-limit posting
# and in your particular Form definition
class MyForm(forms.Form)
... your fields here ...
def __init__(self, *args, **kwargs):
self.user = kwargs.pop('user') # cache the user object you pass in
super(MyForm, self).__init__(*args, **kwargs) # and carry on to init the form
def clean(self):
# test the rate limit by passing in the cached user object
if not ok_to_post(self.user): # use your throttling utility here
raise forms.ValidationError("You cannot post more than once every x minutes")
return self.cleaned_data # never forget this! ;o)
请注意,在clean()
方法中引发通用ValidationError
会将错误放入myform.non_field_errors
因此如果您手动显示表单,则必须确保模板包含{{form.non_field_errors}}
您不在视图中使用ValidationError
,因为这些例外与表单一样。 相反,你应该将用户重定向到其他网址,这将向他解释,他不能很快再次发布。 这是处理这些东西的正确方法。 当输入数据未验证时,应在Form
实例内引发ValidationError
。 不是这种情况。
您可以在视图中使用消息:
from django.contrib import messages
messages.error(request, "Error!")
文档: https : //docs.djangoproject.com/es/1.9/ref/contrib/messages/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.