我无法弄清楚如何控制ModelForms的字段验证。
这是我的模型表格:
class UserForm(ModelForm):
class Meta:
model = User
fields = ('email', 'password')
以下是我在模板中呈现表单的方式:
<form method="post" action="">
{% csrf_token %}
{{ userform.as_p }}
<input type="submit" value="Submit" />
</form>
以下是我的观点:
def login_page(request):
if request.method == 'POST':
userform = UserForm(request.POST)
if userform.is_valid():
email = request.POST['email']
password = request.POST['password']
user = authenticate(username=email, password=password)
if user is not None:
login(request, user)
return redirect('/dashboard/')
else:
# How can I give the user feedback about authentication failute here. Right now it just reloads the form without any messages.
return render(request, "login.html", {"userform": userform})
else:
# Because .is_valid() is called, The userform will validate for email addresses and that a password input is present here.
return render(request, "login.html", {"userform": userform})
else:
userform = UserForm()
return render(request, "login.html", {"userform": userform})
通过阅读文档,这似乎应该像传递我的表单一些自定义属性一样简单;但由于我正在使用ModelForm,我不确定这是否以同样的方式实现。
有没有人可以提供有关如何最好地控制ModelForm字段错误的示例或提示?
谢谢!
答案 0 :(得分:1)
如果您想将错误或警告消息返回给用户(即使验证表单中没有错误),您可以使用messaging framework,也可以insert custom error messsages into the form。
我认为消息传递框架是您最好的选择 - 我认为将错误注入表单并不是一个好主意。如果有人输入了错误的用户名和密码,则不是验证错误,因此不应将其视为错误。只有在向字段输入错误类型的数据时才应抛出验证错误,而不是错误的值。
答案 1 :(得分:1)
Django authentication app有一个你使用的内置AuthenticationForm
。如果查看source code,您可以看到他们的方法是检查clean
方法中的用户名和密码。这样,如果用户名和密码组合无效,则可能会引发验证错误,并且表单将显示错误。
您可以导入AuthenticationForm
并使用以下导入在登录视图中使用它:
from django.contrib.auth.forms import Authentication
您也可以使用内置的login
视图。这意味着您可以利用添加的功能,例如,如果用户未启用Cookie,则显示消息。它还可以降低您创建安全漏洞的可能性。
答案 2 :(得分:1)
很简单,您有多种方式来显示错误消息:
第一个:
1-覆盖表单/模型中的clean方法:
def clean(self):
# To keep the main validation and error messages
super(your_form_name, self).clean()
# Now it's time to add your custom validation
if len(self.cleaned_data['password']) < 10:
self._errors['password']='your password\'s length is too short'
# you may also use the below line to custom your error message, but it doesn't work with me for some reason
raise forms.ValidationError('Your password is too short')
第二个
使用内置验证器的django。
您可以使用模型中的验证器以及您想要的自定义错误消息:
RE = re.compile('^[0-9]{10}$')
field_name = models.CharField('Name', default='your_name',validators=[RegexValidator(regex=RE, message="Inapproperiate Name!")],)
验证者可以使用您可以验证的多个内置验证规则。
please refer to this django documentation
你也可以在表单定义中使用验证器,但验证器内的错误信息不会像错误时的模型一样工作,自定义错误信息使用下面的第三种方法。
第三种方法:
skill = forms.CharField(
label = 'SSkill',
min_length = 2,
max_length = 12,
# message kwarg is only usable in models, yet,
#it doesn't spawn error here.
#validators=[RegexValidator(regex=NME, message="In-approperiate number!")],
required = True,
#Errors dictionary
error_messages={'required': 'Please enter your skill','min_length':'very short entry','invalid':'Improper format'},
#Similar to default you pass in model
initial = 'Extreme Coder'
)
其中,requied,min_length,max_length以及其他都是fomr kw参数,只有当上面几行的验证器与您在验证器中选择的条件不匹配时,才会选择无效。
第四种方法
在此方法中,您将覆盖模型形式的定义,如下所示:
def __init__(self, *args, **kwargs):
super(Your_Form, self).__init__(*args, **kwargs)
self.fields['password'].error_messages['required'] = 'I require that you fill out this field'
第五种方法:
我在其中一个stackoverflow帖子中看到了一些很好的自定义错误方法,如下所示:
class Meta:
model = Customer
exclude = ('user',)
fields = ['birthday','name']
field_args = {
"name" : {
"error_messages" : {
"required" : "Please let us know what to call you!"
"max_length" : "Too short!!!"
}
}
}
可能有其他/更好的做事方式,但这些是最常见的,至少对我而言: - )
我希望这篇文章有所帮助。