Django引发了ValidationError

时间:2016-12-22 12:20:18

标签: django django-forms django-views

我遇到引发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>

1 个答案:

答案 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})