django - Django forms.validation 错误未显示
问题描述
我正在尝试使用用户内置的 djangos 创建一个注册表单。我想要一个密码字段,然后是第二个字段来验证密码是否匹配(请记住,这是一个新用户,因此数据库中尚不存在密码)。我想我真的很接近,似乎我需要验证错误从表单传递到视图。该表单只是清除我们的密码......并留下剩余的输入数据,但根本不会引发验证错误。非常感谢任何想法和帮助!
形式
class UserForm(forms.ModelForm):
password = forms.CharField(widget=forms.PasswordInput())
ver_password = forms.CharField(widget=forms.PasswordInput(attrs={'placeholder': ' confirm password'}))
ver_email = forms.EmailField(widget=forms.EmailInput(attrs={'placeholder': ' confirm email'}))
class Meta():
model = User
fields = ('username',
'password',
'first_name',
'last_name',
'email')
def clean(self):
all_clean_data = super().clean()
clean_email = all_clean_data['email']
clean_ver_email = all_clean_data['ver_email']
clean_password = all_clean_data['password']
clean_ver_password = all_clean_data['ver_password']
if clean_email != clean_ver_email:
raise forms.ValidationError("Emails do not match")
if clean_password != clean_ver_password:
raise forms.ValidationError("Passwords do not match")
return all_clean_data
看法
def register(request):
registered = False
newregister = False
if request.method == 'POST':
user_form = UserForm(data=request.POST)
profile_form = UserProfileInfoForm(data=request.POST)
if user_form.is_valid() and profile_form.is_valid():
user = user_form.save()
user.set_password(user.password)
user.save(update_fields=['username','password','first_name','last_name','email'])
profile = profile_form.save(commit=False)
profile.user = user
if 'profile_pic' in request.FILES:
profile.profile_pic = request.FILES['profile_pic']
profile.save()
registered = True
newregister = True
return render(request, 'dai_members_app/login.html',
{'user_form':user_form,
'profile_form':profile_form,
'registered':registered})
else:
print(user_form.errors,profile_form.errors)
解决方案
如果表单无效,您的视图不会返回任何内容。如果表单有效,它只会返回响应,这就是为什么“表单只是清除我们的密码......并留下剩余的输入数据”
其次,您的视图不寻常,因为通常表单视图同时处理 GET 请求(显示空白表单)和 POST 请求(验证和保存传入数据)。除非你有充分的理由去做不同的事情,否则至少在学习基础知识时应该坚持标准的 Django 模式。
有关表单处理的功能视图,请参阅 Django 文档中的示例: https ://docs.djangoproject.com/en/dev/topics/forms/#the-view
值得注意的是,Django 已经提供了用户注册的表单:from django.contrib.auth.forms import UserCreationForm
. 你应该使用它而不是自己滚动,除非你需要做一些特别的事情,它看起来不像。
这里的教程也是一个很好的起点:https ://simpleisbetterthancomplex.com/tutorial/2017/02/18/how-to-create-user-sign-up-view.html
推荐阅读
- azure - Chrome 中的 AzDO 被强制保存而不进行编辑
- search - 能否禁用 Visual Studio 2019 中的动态搜索?
- r - Plotly(R)中关于“标记”的错误消息
- r - 如何合并R中具有不同列名的两个数据集?
- ios - 为什么 UIAccessibilityNotification 不转向正确的论点?
- powershell - 使用 GitHub 包注册表作为 PowerShell 包存储库
- quarkus - Quarkus 异常处理程序
- java - 在 Chrome 中运行 selenium 测试用例时无法从弹出框加载扩展
- node.js - Mongodb服务器选择超时与nginx,nodejs
- docker - 有没有办法查看完整的 Docker 映像继承?