2016-06-22 10 views
1

HTMLテンプレートに検証エラーを表示しようとしていますが、そのテンプレートのフォームが正しく送信されていないとします。私のforms.pyファイルには、 "@"記号が含まれていない入力済みの文字列を捕捉する関数(clean_email)が含まれていて、実際に動作します。したがって、電子メールフィールドに「@」文字を付けずに送信しようとするフォームは送信されません。DjangoでHTMLテンプレートの検証エラーを発生させる

残念ながら、エラーはHTMLテンプレート上に表示されるため表示されません。それを表示するコードはcontact.html(contactform.errors)の15行目にあります。このコードは結果を生成しません。ここでは、関連するファイルは、次のとおりです。

Models.py

from __future__ import unicode_literals 
from django.db import models 

class Contact(models.Model): 

    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    phone_number = models.CharField(max_length=30, blank=True) 
    email = models.CharField(max_length=50) 
    message = models.TextField(default=" ") 

Forms.py

from models import Contact 
from django.forms import ModelForm 
from django.core.exceptions import ValidationError 
from django import forms 

class ContactForm(ModelForm): 

    class Meta: 
     model = Contact 
     fields = "__all__" 

    def clean_email(self): 
     email = self.cleaned_data["email"] 

     if "@" not in email: 
      raise ValidationError("Not an Email Address") 

     return email 

Views.py最後に

from django.shortcuts import render 
from django.core.urlresolvers import reverse 
from django.http import HttpResponseRedirect 
from forms import ContactForm 

def contact(request): 
    contactform = ContactForm() 
    if request.method == "POST": 
     contactform = ContactForm(request.POST) 
     if contactform.is_valid(): 
      message = contactform.save(commit=False) 
      message.save() 
      return HttpResponseRedirect(reverse("contact")) 
     else: 
      print(contactform.errors) 
      contactform = ContactForm() 
    return render(request,"contact_form/contact.html",{"contactform":contactform}) 

、Contact.HTML

{% block content %} 

<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css"> 
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css"> 

    <link rel="stylesheet" href="{% static "css/main.css" %}"> 
    <link rel="stylesheet" href="{% static "css/contact.css" %}"> 

    <div class="outer"> 
     <form method="POST" action=""> 
     {% csrf_token %} 
      <ul> 
      <li> 
       <label = for="email">Email</label> 
       {{ contactform.email }} 
       {{ contactform.errors }} 
      </li> 
      </ul> 
     <input type="submit" value="Submit Form"/> 
     </form> 
    </div> 

{% endblock %} 
は、

アイデア/助けていただきありがとうございます!

+0

なぜあなたはmodels.EmailFieldを使用していませんか? –

+0

models.EmailFieldを使用する場合は、カスタム検証を一切行う必要はありません。「うまくいく」 –

+0

私は自分の仕事でCapstoneプロジェクトでこれをやっています。このプロジェクトの特色の1つは、カスタムフォームの検証を行い、テンプレートにレンダリングされたその検証によってキャッチされたエラーを持つことです。私はこの前にEmailFieldを使っていました。 – Will

答えて

1

アパート(あなたがやるべきこと)models.EmailFieldを使用してから私はそれを考え出した{{ contactform.errors }}

+0

私は私の仕事で棺のプロジェクトのためにこれをやっています。このプロジェクトの特色の1つは、カスタムフォームの検証を行い、テンプレートにレンダリングされたその検証によってキャッチされたエラーを持つことです。私はこれの前にEmailFieldを使っていました。 また、コードが機能しませんでした。テンプレートにNothinが表示され、Chromeの開発ツールを使用してHTMLを調べました。何もない。 – Will

1

{{ contactform.email.errors }}に変更する必要があります。検証エラーが発生する前に、私は新しいフォームを生成しようとしていました。

contactform = ContactForm() 

^私のviews.pyファイルのコードは、HTMLテンプレート上に完全に新しいフォームが作成されるようにします。一度それを取り除くと、すべてがうまくいくように機能しました。

関連する問題