我试图使用内置于用户的djangos创建一个注册表单。我希望有一个密码字段,然后是第二个字段来验证密码匹配(请记住,这是一个新用户,所以数据库中还不存在密码)。我认为我非常接近,似乎我需要验证错误从表单传递到视图。表单只会清除我们的passwords...and,留下剩下的输入数据,但根本不会引发验证错误。任何想法和帮助都是非常感谢的!
表单
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)
发布于 2020-01-29 17:56:10
如果表单无效,则视图不会返回任何内容。它只在表单有效的情况下返回响应,这就是为什么“表单只是清除我们的passwords...and,留下其余的输入数据”。
其次,视图是不寻常的,因为表单视图通常同时处理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
https://stackoverflow.com/questions/59977196
复制相似问题