Return Django 中自定义表单的错误消息
Return error message to custom form in Django
我的自定义注册表单中的字段如下所示:
<div class="form-group">
{{ form.email.errors }}
label for="{{form.email.id_for_label}}">
<b>Email</b>
</label>
{{ form.email }}
</div>
我的 views.py 看起来像这样:
def registration(request):
registered = False
if request.method == 'POST':
form = RegForm(data=request.POST)
if form.is_valid():
email = form.cleaned_data['email']
phone = form.cleaned_data['phone']
password = form.cleaned_data['password']
password2 = form.cleaned_data['password2']
user = User()
user.email = email
user.username = email
user.is_active = False
user.set_password(password)
user.save()
return render(request, 'appname/index.html', {'registered': True})
else:
form = RegForm()
render(request, 'appname/index.html', {'form': form})
forms.py:
class RegForm(forms.Form):
email = forms.EmailField(error_messages={'required': 'Please enter your Email ID'})
password=forms.CharField(widget=forms.PasswordInput())
password2=forms.CharField(widget=forms.PasswordInput())
phone= forms.CharField(label="Mobile Number",max_length=10)
#clean email field
def clean_email(self):
email = self.cleaned_data["email"]
try:
User._default_manager.get(email=email)
except User.DoesNotExist:
return email
raise forms.ValidationError('duplicate email')
假设电子邮件已经存在于数据库中,我如何 return 向自定义表单发送错误消息并将其显示在 {{form.email.errors}}
的位置
编辑
如果电子邮件存在,我在 forms.py 和 returning raise forms.ValidationError('duplicate email')
中使用了 ValidationError。如何在自定义表单中显示此错误?
您可以为 RegForm
中的 email
字段编写自定义清理器。类似于:
class RegForm(forms.Form):
# Everything as before.
...
#clean email field
def clean_email(self):
email = self.cleaned_data["email"]
if User.objects.filter(email=email).exists():
raise forms.ValidationError('duplicate email')
return email
这已记录在案 here。
视图的逻辑似乎有问题。
评估表单时 form.is_valid()
将引发 ValidationError
并且错误将在表单中可用。
如果表单无效,它似乎没有返回任何内容,或者使带有错误的表单在模板中可用。
def registration(request):
registered = False
if request.method == 'POST':
form = RegForm(data=request.POST)
if form.is_valid():
email = form.cleaned_data['email']
phone = form.cleaned_data['phone']
password = form.cleaned_data['password']
password2 = form.cleaned_data['password2']
user = User()
user.email = email
user.username = email
user.is_active = False
user.set_password(password)
user.save()
return render(request, 'appname/index.html', {'registered': True})
else:
form = RegForm()
return render(request, 'appname/index.html', {'form': form})
而且标签好像漏了一个开头<
<div class="form-group">
{{ form.email.errors }}
<label for="{{ form.email.id_for_label }}">
<b>Email</b>
</label>
{{ form.email }}
</div>
作为旁注,我建议在成功创建用户后使用 GET
请求重定向用户,以避免任何用户意外点击重新加载并发送另一个负载。例如
return redirect('/confirmation/')
回答我自己的问题。我是新手,因此花了很多时间和精力来解决这个问题。
在我看来,我只是错过了这一点:
if form.is_valid():
#do something, add user ot DB
return render(request, 'mudramantri/index.html', {'registered': True})
else:
return render(request, 'mudramantri/index.html', {'form': form})
因为,当表单无效时,我没有返回表单,视图为空,因此出现错误。
我的自定义注册表单中的字段如下所示:
<div class="form-group">
{{ form.email.errors }}
label for="{{form.email.id_for_label}}">
<b>Email</b>
</label>
{{ form.email }}
</div>
我的 views.py 看起来像这样:
def registration(request):
registered = False
if request.method == 'POST':
form = RegForm(data=request.POST)
if form.is_valid():
email = form.cleaned_data['email']
phone = form.cleaned_data['phone']
password = form.cleaned_data['password']
password2 = form.cleaned_data['password2']
user = User()
user.email = email
user.username = email
user.is_active = False
user.set_password(password)
user.save()
return render(request, 'appname/index.html', {'registered': True})
else:
form = RegForm()
render(request, 'appname/index.html', {'form': form})
forms.py:
class RegForm(forms.Form):
email = forms.EmailField(error_messages={'required': 'Please enter your Email ID'})
password=forms.CharField(widget=forms.PasswordInput())
password2=forms.CharField(widget=forms.PasswordInput())
phone= forms.CharField(label="Mobile Number",max_length=10)
#clean email field
def clean_email(self):
email = self.cleaned_data["email"]
try:
User._default_manager.get(email=email)
except User.DoesNotExist:
return email
raise forms.ValidationError('duplicate email')
假设电子邮件已经存在于数据库中,我如何 return 向自定义表单发送错误消息并将其显示在 {{form.email.errors}}
编辑
如果电子邮件存在,我在 forms.py 和 returning raise forms.ValidationError('duplicate email')
中使用了 ValidationError。如何在自定义表单中显示此错误?
您可以为 RegForm
中的 email
字段编写自定义清理器。类似于:
class RegForm(forms.Form):
# Everything as before.
...
#clean email field
def clean_email(self):
email = self.cleaned_data["email"]
if User.objects.filter(email=email).exists():
raise forms.ValidationError('duplicate email')
return email
这已记录在案 here。
视图的逻辑似乎有问题。
评估表单时 form.is_valid()
将引发 ValidationError
并且错误将在表单中可用。
如果表单无效,它似乎没有返回任何内容,或者使带有错误的表单在模板中可用。
def registration(request):
registered = False
if request.method == 'POST':
form = RegForm(data=request.POST)
if form.is_valid():
email = form.cleaned_data['email']
phone = form.cleaned_data['phone']
password = form.cleaned_data['password']
password2 = form.cleaned_data['password2']
user = User()
user.email = email
user.username = email
user.is_active = False
user.set_password(password)
user.save()
return render(request, 'appname/index.html', {'registered': True})
else:
form = RegForm()
return render(request, 'appname/index.html', {'form': form})
而且标签好像漏了一个开头<
<div class="form-group">
{{ form.email.errors }}
<label for="{{ form.email.id_for_label }}">
<b>Email</b>
</label>
{{ form.email }}
</div>
作为旁注,我建议在成功创建用户后使用 GET
请求重定向用户,以避免任何用户意外点击重新加载并发送另一个负载。例如
return redirect('/confirmation/')
回答我自己的问题。我是新手,因此花了很多时间和精力来解决这个问题。 在我看来,我只是错过了这一点:
if form.is_valid():
#do something, add user ot DB
return render(request, 'mudramantri/index.html', {'registered': True})
else:
return render(request, 'mudramantri/index.html', {'form': form})
因为,当表单无效时,我没有返回表单,视图为空,因此出现错误。