Python 验证和显示自定义Django表单中的错误
当我使用Python 验证和显示自定义Django表单中的错误,python,django,forms,validation,Python,Django,Forms,Validation,当我使用form.as\u p来显示我的表单时,例如,我在没有填写任何字段的情况下单击Submit按钮,它会显示错误消息,要求我填写所需字段。但是,当我自定义html模板的输出时,它不会验证字段,也不会显示任何错误消息。My forms.py: # forms.py class SignUpForm(forms.ModelForm): username = forms.CharField(label='Username', max_length=75, widget=forms.
form.as\u p
来显示我的表单时,例如,我在没有填写任何字段的情况下单击Submit按钮,它会显示错误消息,要求我填写所需字段。但是,当我自定义html模板的输出时,它不会验证字段,也不会显示任何错误消息。My forms.py:
# forms.py
class SignUpForm(forms.ModelForm):
username = forms.CharField(label='Username', max_length=75, widget=forms.TextInput(attrs={'placeholder' : 'Username'}))
email = forms.EmailField(label='Email', max_length=255)
first_name = forms.CharField(label='First Name', max_length=75)
last_name = forms.CharField(label='Last Name', max_length=75)
birthday = forms.DateField(label='Birthday')
gender = forms.ChoiceField(choices = User.GENDER_CHOICES)
class Meta:
model = User
fields = ['username', 'password', 'email', 'first_name', 'last_name', 'birthday', 'gender']
widgets = {
'password': forms.PasswordInput(attrs={'class': 'form-control'}),
'email': forms.EmailInput(attrs={'class': 'form-control'}),
'birthday': forms.DateInput(attrs={'class': 'form-control'}),
}
def save(self, commit=True):
user = super(SignUpForm, self).save(commit=False)
user.username = self.cleaned_data['username']
user.set_password(self.cleaned_data['password'])
user.email = self.cleaned_data['email']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.birthday = self.cleaned_data['birthday']
user.gender = self.cleaned_data['gender']
if commit:
user.save()
return user
我的HTML模板如下所示:
# registration.html
<form class="form-signin" action="/register/" method="post">
<h2 class="form-signin-heading">registration now</h2>
<div class="login-wrap">
<p>Enter your personal details below</p>
<input type="text" class="form-control" placeholder="{{ form.first_name.label }}" name="{{ form.first_name.name }}" id="id_{{ form.first_name.name }}" maxlength="75" autofocus>
<input type="text" class="form-control" placeholder="{{ form.last_name.label }}" name="{{ form.last_name.name }}" id="id_{{ form.last_name.name }}" maxlength="75" autofocus>
<input type="text" class="form-control" placeholder="{{ form.email.label }}" name="{{ form.email.name }}" id="id_{{ form.email.name }}" maxlength="255" autofocus>
<div class="radios">
{% for choice in form.gender.field.choices %}
<label class="label_radio col-lg-4 col-sm-4" for="">
<input name="{{ form.gender.name }}" id="radio-01" value="{{choice.0}}" type="radio" checked /> {{ choice.1 }}
</label>
{% endfor %}
</div>
<p> Enter your account details below</p>
<input type="text" class="form-control" placeholder="{{ form.username.label }}" name="{{ form.username.name }}" id="id_{{ form.username.name }}" autofocus>
<input type="password" class="form-control" placeholder="{{ form.password.label }}" name="{{ form.password.name }}" id="id_{{ form.password.name }}">
<label class="checkbox">
<input type="checkbox" value="agree this condition"> I agree to the Terms of Service and Privacy Policy
</label>
<input class="btn btn-lg btn-login btn-block" type="submit" value="Submit"/>
<div class="registration">
Already Registered.
<a class="" href="login.html">
Login
</a>
</div>
</div>
</form>
#registration.html
现在注册
在下面输入您的个人详细信息
{form.gender.field.choices%中的选项为%s}
{{choice.1}}
{%endfor%}
在下面输入您的帐户详细信息
我同意服务条款和隐私政策
已经注册了。
我现在从Django开始,我阅读了有关自定义表单的文档,但我没有找到任何关于如何验证字段为
表单的信息。正如\u p
所做的那样。这是为表单生成自定义HTML的错误方法。您仍然应该使用Django表单字段-{{form.first_name}}
等,而不是自己创建HTML版本并填充它们
但是,问题比这简单:您忘记为每个字段添加{{form.myfield.errors}
,并在表单顶部添加{{form.non_field_errors}
还要注意的是,没有理由在
save
中做所有额外的工作。所有这些字段都已由超类设置:您需要手动处理的唯一事情是user.set\u password
正确的方法是什么?我必须创造这样的东西username=forms.CharField(label='username',max_length=75,widget=forms.TextInput(attrs={'placeholder':'username','class':'form control'}))
。是的,类似这样。或者查看关于动态执行的各种想法。