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 %}
は、
アイデア/助けていただきありがとうございます!
なぜあなたはmodels.EmailFieldを使用していませんか? –
models.EmailFieldを使用する場合は、カスタム検証を一切行う必要はありません。「うまくいく」 –
私は自分の仕事でCapstoneプロジェクトでこれをやっています。このプロジェクトの特色の1つは、カスタムフォームの検証を行い、テンプレートにレンダリングされたその検証によってキャッチされたエラーを持つことです。私はこの前にEmailFieldを使っていました。 – Will