1 回答
![?](http://img1.sycdn.imooc.com/5333a0350001692e02200220-100-100.jpg)
TA贡献2012条经验 获得超12个赞
一旦调用form.is_valid()表单的实例,是否存在错误就变得非常重要,因为这些错误存在于该实例上。因此,您需要将其传递回用户才能显示错误。
我的意思的一个简单例子是:
def register(request):
form = CustomUserCreationForm()
if request.method == "POST":
form = CustomUserCreationForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_valid = False
user.save()
# Maybe redirect here
else:
messages.info(request, 'invalid registration details')
return render(
request, "users/register.html",
{"form": form}
)
这样,您就可以迭代模板中的错误。
<form method="post" action="">
{% csrf_token %}
{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
{{ error }}
{% endfor %}
{% endif %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form %}
{{ field }}
{{ field.errors.as_ul }}
{% endfor %}
<button class="btn btn-primary" type="submit">Submit</button>
</form>
像这样的更通用的模板也会对您有所帮助,因为您可以将其重用于任何表单,而不是像示例中那样指定特定的表单和字段名称。
我要指出的另一件事是,您认为存在很多复杂性,例如对请求方法的大量检查。还有3种不同的形式。如果页面中有不同的表单,您可以命名提交按钮,以便您可以检查正在提交哪个表单。我在这里有一个答案来展示如何处理多种表单。
您这样做时user.email没有检查用户是否经过身份验证或检查电子邮件是否存在,因此那里也会发生错误。
因此,为了简化您的视图,您可以执行类似的操作(在命名表单按钮之后);
def home(request):
user = request.user
# for rendering texts
text_form = TextForm()
signin_form = SigninForm()
signup_form = SignupForm()
if request.method == "POST":
if 'text_form' in request.POST:
text_form = TextForm(request.POST)
if text_form.is_valid() and request.user.is_authenticated:
obj = text_form.save(commit=False)
author = User.objects.filter(email=user.email).first()
obj.author = author
text_form.save()
if 'signin_form' in request.POST:
signin_form = SigninForm(request.POST)
if signin_form.is_valid():
email = request.POST['email']
password = request.POST['password']
user = authenticate(email=email, password=password)
if user:
login(request, user)
elif user is None:
messages.error(request, 'ُEmail or password is incorrect')
if 'signup_form' in request.POST:
signup_form = SignupForm(request.POST)
if signup_form.is_valid():
User = signup_form.save()
full_name = signup_form.cleaned_data.get('full_name')
email = signup_form.cleaned_data.get('email')
raw_password = signup_form.cleaned_data.get('password1')
account = authenticate(email=email, password=raw_password)
login(request, account)
texts = Text.objects.all().order_by('-id')
context = {
'signin_form': signin_form,
'signup_form': signup_form,
'text_form': text_form,
'texts': texts
}
return render(request, 'main/home.html', context)
添加回答
举报