use*_*875 5 django django-templates django-models django-forms django-errors
所以我有自己的看法:
def home_page(request):
form = UsersForm()
if request.method == "POST":
form = UsersForm(request.POST)
if form.is_valid():
form.save()
c = {}
c.update(csrf(request))
c.update({'form':form})
return render_to_response('home_page.html', c)
Run Code Online (Sandbox Code Playgroud)
我的forms.py:
class UsersForm(forms.ModelForm):
class Meta:
model = Users
widgets = {'password':forms.PasswordInput()}
def __init__(self, *args, **kwargs):
super( UsersForm, self ).__init__(*args, **kwargs)
self.fields[ 'first_name' ].widget.attrs[ 'placeholder' ]="First Name"
self.fields[ 'last_name' ].widget.attrs[ 'placeholder' ]="Last Name"
self.fields[ 'password' ].widget.attrs[ 'placeholder' ]="Password"
Run Code Online (Sandbox Code Playgroud)
和我的模板:
<html>
<body>
<form method="post" action="">{% csrf_token %}
{{ form.first_name }} {{form.last_name }} <br>
{{ form.password }} <br>
<input type="submit" value="Submit Form"/>
</form>
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<p> {{ errors }} </p>
{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}
<p> {{ error }} </p>
{% endfor %}
{% endif %}
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在,请记住,在分割表单字段之前,我的表单如下所示:
<form method="post" action="">{% csrf_token %}
{{ form }}
<input type="submit" value="Submit Form"/>
</form>
Run Code Online (Sandbox Code Playgroud)
如果表单出现问题(例如缺少一个字段),它将自动给出错误消息。在将模板中的表单字段(由{{form.first_name}},{{form.last_name}}和{{form.password}}划分为自己的部分)拆分之后,它停止自动提供错误消息。这正常吗?
但是主要的问题是,如果有错误消息,我的{{if form.errors}}语句为什么不起作用/显示错误消息?例如,如果我故意不填写表单中的字段,而是单击“提交”,则数据库不会获得更新(这是一件好事),但不会给出任何错误消息。知道为什么吗?
我也尝试删除{{forms.non_field_errors}},并尝试仅返回如下字段错误:
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<p> {{ errors }} </p>
{% endfor %}
{% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
但它仍然不起作用。
我发现了错误(错字)。
片段应该是:
{% if form.errors %}
{% for field in form %}
{% for error in field.errors %}
<p> {{ error }} </p>
{% endfor %}
{% endfor %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)
我有errors
而不是error
.
小智 5
如果 is_valid() 不为 true,则必须再次发送表单上下文,
if form.is_valid():
return redirect('/user/contact/')
else:
return render(request, 'users/contact.html', context={'form': form})
Run Code Online (Sandbox Code Playgroud)
因为您的错误将显示在您的表单中,否则:它将返回 ValueError