我遇到引发ValidationError的问题,如果用户只写1,2,3个单词,它就不会显示。如果我按提交,它只显示标题联系人和提交按钮。它应该显示用户是否写下4个字。
views.py
def contact(request):
data = dict()
if request.method == "POST":
form = ContactForm(request.POST)
if form.is_valid():
subject = form.cleaned_data['subject']
email = form.cleaned_data['email']
message = form.cleaned_data['message']
try:
send_mail(subject, message, email, ['inbox01@yahoo.com'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
return HttpResponseRedirect('/contact/thanks/')
else:
data['form'] = ContactForm(
initial={'subject': 'I love your site!'}
)
return render(request, 'contact_form.html', data)
forms.py
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
email = forms.EmailField(required=True)
message = forms.CharField(widget=forms.Textarea, min_length=7)
def clean_message(self):
message = self.cleaned_data['message']
num_words = len(message.split())
if num_words < 4:
raise forms.ValidationError('Not enough words!')
return message
contact_form.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Contact us</title>
</head>
<body>
<h1>Contact us</h1>
<form action="" method="POST">
<table>
{{ form.as_table }}
</table>
{% csrf_token %}
<input type="submit" value="Submit">
</form>
</body>
</html>
答案 0 :(得分:2)
如果表单无效,则必须添加data['form'] = form
才能重新显示页面上的表单。或者更好的是,根本不要使用data
变量:
def contact(request):
if request.method == "POST":
form = ContactForm(request.POST)
if form.is_valid():
subject = form.cleaned_data['subject']
email = form.cleaned_data['email']
message = form.cleaned_data['message']
try:
send_mail(subject, message, email, ['inbox01@yahoo.com'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
return HttpResponseRedirect('/contact/thanks/')
else:
form = ContactForm(
initial={'subject': 'I love your site!'}
)
return render(request, 'contact_form.html', {'form': form})