无法从浏览器上的 ModelForm 引发验证错误 (DJANGO)
Unable to raise Validation Error from ModelForm on the browser (DJANGO)
如果用户输入数据库中已有的电子邮件,我会尝试引发错误并在浏览器上显示错误。由于某些原因,数据库中没有保存任何内容,而不是引发错误,而是将用户重定向到我设置为重定向到的页面。
如果数据库中存在电子邮件,我希望能够停止用户并引发错误。
型号:
class Foo(models.Model):
full_name = models.CharField(max_length=50)
email = models.EmailField(max_length=50, blank=False)
phone_number = models.CharField(max_length=10, blank=False)
表格。
from django import forms
from .models import Foo
class FooModelForm(ModelForm):
class Meta:
model = Foo
fields = ['full_name',
'email',
'phone_number']
help_texts = {'full_name': ('Required'),
'email': ('Required'),
'phone_number': ('Required')}
def clean_email(self):
'''
Check if exists in database.
'''
email = self.cleaned_data.get('email')
try:
match = Foo.objects.get(email=email)
except Foo.DoesNotExist:
return email
# raise forms.ValidationError('This email is already in use.')
from django.shortcuts import render, redirect
from snippets.models import Foo
from snippets.forms import FooModelForm
def index(request):
if request.method == 'POST':
form = FooModelForm(request.POST)
if form.is_valid():
form.save()
return redirect('snippets:form-sent')
else:
form = FooModelForm()
context = {'form':form}
return render(request, 'snippets/index.html', context)
HTML
<form method="post" id="form">
{% csrf_token %}
{{ form|crispy }}
<div class="text-center">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
我完全迷失在这里,尽管它可能很简单。
如有任何帮助,我们将不胜感激。
你快到了!!只需按照下面的代码片段
from django import forms
from .models import Foo
class FooModelForm(ModelForm):
class Meta:
model = Foo
fields = ['full_name',
'email',
'phone_number']
help_texts = {'full_name': ('Required'),
'email': ('Required'),
'phone_number': ('Required')}
<b>def clean_email(self):
'''
Check if exists in database.
'''
email = self.cleaned_data.get('email')
if Foo.objects.filter(email=email).exists():
return email
else:
raise forms.ValidationError('This email is already in use.')</b>
为什么我要使用 exists()
方法而不是 try...except
?
它比 try..except
更快更高效。
参考 : What is more efficient .objects.filter().exists() or get() wrapped on a try
您有一个简单的缩进问题。您的 return redirect...
行总是在 POST 上被调用,即使表单无效。将其进一步缩进,使其位于 is_valid
块内。
如果用户输入数据库中已有的电子邮件,我会尝试引发错误并在浏览器上显示错误。由于某些原因,数据库中没有保存任何内容,而不是引发错误,而是将用户重定向到我设置为重定向到的页面。
如果数据库中存在电子邮件,我希望能够停止用户并引发错误。
型号:
class Foo(models.Model):
full_name = models.CharField(max_length=50)
email = models.EmailField(max_length=50, blank=False)
phone_number = models.CharField(max_length=10, blank=False)
表格。
from django import forms
from .models import Foo
class FooModelForm(ModelForm):
class Meta:
model = Foo
fields = ['full_name',
'email',
'phone_number']
help_texts = {'full_name': ('Required'),
'email': ('Required'),
'phone_number': ('Required')}
def clean_email(self):
'''
Check if exists in database.
'''
email = self.cleaned_data.get('email')
try:
match = Foo.objects.get(email=email)
except Foo.DoesNotExist:
return email
# raise forms.ValidationError('This email is already in use.')
from django.shortcuts import render, redirect
from snippets.models import Foo
from snippets.forms import FooModelForm
def index(request):
if request.method == 'POST':
form = FooModelForm(request.POST)
if form.is_valid():
form.save()
return redirect('snippets:form-sent')
else:
form = FooModelForm()
context = {'form':form}
return render(request, 'snippets/index.html', context)
HTML
<form method="post" id="form">
{% csrf_token %}
{{ form|crispy }}
<div class="text-center">
<button type="submit" class="btn btn-primary">Submit</button>
</div>
</form>
我完全迷失在这里,尽管它可能很简单。
如有任何帮助,我们将不胜感激。
你快到了!!只需按照下面的代码片段
from django import forms
from .models import Foo
class FooModelForm(ModelForm):
class Meta:
model = Foo
fields = ['full_name',
'email',
'phone_number']
help_texts = {'full_name': ('Required'),
'email': ('Required'),
'phone_number': ('Required')}
<b>def clean_email(self):
'''
Check if exists in database.
'''
email = self.cleaned_data.get('email')
if Foo.objects.filter(email=email).exists():
return email
else:
raise forms.ValidationError('This email is already in use.')</b>
为什么我要使用 exists()
方法而不是 try...except
?
它比 try..except
更快更高效。
参考 : What is more efficient .objects.filter().exists() or get() wrapped on a try
您有一个简单的缩进问题。您的 return redirect...
行总是在 POST 上被调用,即使表单无效。将其进一步缩进,使其位于 is_valid
块内。