django 1.8 表单的自定义验证不起作用
django 1.8 custom validation of form not working
我正在学习 django 1.8(python 2.7.8) 我正在尝试验证电子邮件、名字和姓氏 field.The 问题是什么我插入到表单中,它被保存到数据库中(只有默认的电子邮件验证有效)。以下是我的表单、视图、模型和管理文件的外观 like.Any 建议?谢谢
models.py
from django.db import models
# Create your models here.
class SignUp(models.Model):
email = models.EmailField()
first_name = models.CharField(max_length=25,blank=True,null=True)
last_name = models.CharField(max_length=25,blank=True,null=True)
timestamp = models.DateTimeField(auto_now_add=True,auto_now=False)
updated = models.DateTimeField(auto_now_add=False,auto_now=True)
def __unicode__(self):
return self.email
admin.py
from django.contrib import admin
# Register your models here.
from .models import SignUp
class SignUpAdmin(admin.ModelAdmin):
list_display = ["__unicode__","first_name","last_name","timestamp","updated"]
class Meta:
model = SignUp
admin.site.register(SignUp, SignUpAdmin)
views.py
from django.shortcuts import render
from forms import SignUpForm
# Create your views here.
def home(request):
title = "Welcome"
form = SignUpForm(request.POST or None)
context = { "title": title,"form":form, }
if form.is_valid():
instance = form.save(commit=False)
instance.save()
return render(request, "home.html", context)
forms.py
from django import forms
from .models import SignUp
import re
class SignUpForm(forms.ModelForm):
class Meta:
model = SignUp
fields = ['first_name','last_name','email']
def clean_email(self):
email = self.cleaned_data.get('email')
email_base, provider = email.split('@')
domain,extension = provider.split('.')
if provider.count('.') > 2: #email provider should not have more than 2 "dots=> ."
raise forms.ValidationError("Please use valid email address")
return email
def clean_first_name(self):
first_name = self.cleaned_data.get('first_name')
if bool(re.search('[\d\s]',first_name)): #firstname should not have whitespace or digits
raise forms.ValidationError("Please dont use numbers or space in Name Field")
return first_name
def clean_last_name(self):
last_name = self.cleaned_data.get('last_name')
if bool(re.search('[\d]',last_name)): #lastname should not have digits
raise forms.ValidationError("Please dont use numbers or space in Name Field")
return last_name
urls.py
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^$','newsletter.views.home', name='home'),
]
home.html
<html>
<title>Home Page</title>
<body>
{{ title }} {{ request.user }} <br>
<form method="post" action="">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="submit">
</form>
</body>
</html>
您的 form.py 似乎 fine.I 认为您没有显示模板中的错误 HTML。
{% 如果 form.errors %}
{% form.errors %}
中的错误
{{ 错误 }}
{% endfor %}
{% endif %}
我犯了一些愚蠢的错误(缩进)。 post
上的问题已更正且代码正确
我正在学习 django 1.8(python 2.7.8) 我正在尝试验证电子邮件、名字和姓氏 field.The 问题是什么我插入到表单中,它被保存到数据库中(只有默认的电子邮件验证有效)。以下是我的表单、视图、模型和管理文件的外观 like.Any 建议?谢谢
models.py
from django.db import models
# Create your models here.
class SignUp(models.Model):
email = models.EmailField()
first_name = models.CharField(max_length=25,blank=True,null=True)
last_name = models.CharField(max_length=25,blank=True,null=True)
timestamp = models.DateTimeField(auto_now_add=True,auto_now=False)
updated = models.DateTimeField(auto_now_add=False,auto_now=True)
def __unicode__(self):
return self.email
admin.py
from django.contrib import admin
# Register your models here.
from .models import SignUp
class SignUpAdmin(admin.ModelAdmin):
list_display = ["__unicode__","first_name","last_name","timestamp","updated"]
class Meta:
model = SignUp
admin.site.register(SignUp, SignUpAdmin)
views.py
from django.shortcuts import render
from forms import SignUpForm
# Create your views here.
def home(request):
title = "Welcome"
form = SignUpForm(request.POST or None)
context = { "title": title,"form":form, }
if form.is_valid():
instance = form.save(commit=False)
instance.save()
return render(request, "home.html", context)
forms.py
from django import forms
from .models import SignUp
import re
class SignUpForm(forms.ModelForm):
class Meta:
model = SignUp
fields = ['first_name','last_name','email']
def clean_email(self):
email = self.cleaned_data.get('email')
email_base, provider = email.split('@')
domain,extension = provider.split('.')
if provider.count('.') > 2: #email provider should not have more than 2 "dots=> ."
raise forms.ValidationError("Please use valid email address")
return email
def clean_first_name(self):
first_name = self.cleaned_data.get('first_name')
if bool(re.search('[\d\s]',first_name)): #firstname should not have whitespace or digits
raise forms.ValidationError("Please dont use numbers or space in Name Field")
return first_name
def clean_last_name(self):
last_name = self.cleaned_data.get('last_name')
if bool(re.search('[\d]',last_name)): #lastname should not have digits
raise forms.ValidationError("Please dont use numbers or space in Name Field")
return last_name
urls.py
from django.conf.urls import include, url
from django.contrib import admin
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^$','newsletter.views.home', name='home'),
]
home.html
<html>
<title>Home Page</title>
<body>
{{ title }} {{ request.user }} <br>
<form method="post" action="">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="submit">
</form>
</body>
</html>
您的 form.py 似乎 fine.I 认为您没有显示模板中的错误 HTML。
{% 如果 form.errors %}
{% form.errors %}
中的错误
{{ 错误 }}
{% endfor %}
{% endif %}
我犯了一些愚蠢的错误(缩进)。 post
上的问题已更正且代码正确