2016-12-22 31 views
1

私は、ValidationErrorを引き上げる際に問題があります。ユーザが1,2,3ワードだけを書き込むと表示されません。私がsubmitを押すと、それはタイトルContactとsubmitボタンだけが表示されます。ユーザーが4単語以下で書き込む場合に表示されます。フォームが無効である場合Django raise ValidationError

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, ['[email protected]']) 
      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> 

答えて

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, ['[email protected]']) 
      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}) 
+0

OK、それが動作しますが、それはデータ[「フォーム」] =フォームで作業していない理由を私は理解していない –

+0

'データ[「フォーム」] =フォーム 'はリダイレクトの直下にある必要があります。 – Udi

+0

ありがとうございましたデータは['form'] = form aswell –

関連する問題