1 回答

TA貢獻2012條經(jīng)驗 獲得超12個贊
一旦調(diào)用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沒有檢查用戶是否經(jīng)過身份驗證或檢查電子郵件是否存在,因此那里也會發(fā)生錯誤。
因此,為了簡化您的視圖,您可以執(zhí)行類似的操作(在命名表單按鈕之后);
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)
添加回答
舉報