Django:尝试在我的注册表中创建自定义 2 密码确认.表格无效?



我的名字是Paul,我是一名高中早期的初学者,正在做我的第一个"独立"项目。"独立"的意思是没有教程指导。我的目标是制作一个日历网站,只是为了跟踪家庭作业、会议等事件列表。

目前,我正在填写注册表。起初,我使用了内置的UserCreationForm,但我决定创建自己的HTML表单。我正在努力重新创建这个 2 密码确认表单,该表单将接受两个输入,确保没有任何禁止的密钥,确保两个密码匹配,然后将该密码保存到用户模型的密码中,以及用户名、first_name和last_name(这将发生在我的 view.py 文件中(。

当我第一次尝试注册时,不会弹出任何内容,当我检查管理页面时,结果发现没有新用户。所以我在我的视图中放置了消息 if 语句,以查看代码被切断的位置。事实证明,form.is_valid返回的是假的,我不太确定为什么。

我想相信可能是我的 HTML 表单输入与我的 forms.py 字段不匹配,但我需要帮助来解决这个问题。任何帮助将不胜感激。

这是我 form.py 文件。

from django import forms
from django.contrib.auth.models import User

class UserRegisterForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', 'password']

这是寄存器.html文件,两个密码的输入形式。此窗体将扩展到另一个基本模板。

<form method="POST">
{% csrf_token %}
<div>
<label for="id_username">Username: </label>
<div>
<input id="id_username" type="text" name="username">
</div>
</div>
<div>
<label for="id_first_name">First Name: </label>
<div>
<input id="id_first_name" type="text" name="first_name">
</div>
</div>
<div>
<label for="id_last_name">Last Name: </label>
<div>
<input id="id_last_name" type="text" name="last_name">
</div>
</div>
<div>
<label for="id_password1">Password: </label>
<div>
<input id="id_password1" type="password" name="password1">
</div>
</div>
<div>
<label for="id_password2">Password Confirmation: </label>
<div>
<input id="id_password2" type="password" name="password2">
</div>
</div>
<button type="submit">Register</button>
<div>
<small>Already Have An Account? <a href="{% url 'login' %}">Login</a></small>
</div>
{% if messages %}
{% for message in messages %}
<div role="alert">
{{ message }}
</div>
{% endfor %}
{% endif %}
</form>

这是我 views.py 文件,我正在尝试验证两个密码是否符合条件,然后将其保存到用户模型中。

from django.shortcuts import render, redirect
from .forms import UserRegisterForm
from django.contrib.auth.decorators import login_required
from django.contrib import messages

def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)  
if form.is_valid():
password1 = request.POST.get('password1')
password2 = request.POST.get('password2')
keys = {'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J',
'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T',
'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', 'z', 'Z', '1', '2', '3', '4', '5', '6', '7', '8',
'9', '0', '-', '_', '.'}
for key in keys:
if key not in password1:
if password1 == password2:
form.instance.password = password1
form.save()
messages.success(request, 'User has been saved.')
return redirect('login')
else:
messages.error(request, 'Passwords do not match.')
return redirect('register')
else:
messages.error(request, 'Password contains illegal keys.')
return redirect('register')
else:
messages.error(request, 'Form is not valid.')
else:
messages.error(request, 'request method is not POST.')
form = UserRegisterForm()
return render(request, 'User/register.html', {'form': form})

在最后的if语句中,我不确定如何将密码保存到表单中以使其成为User。感谢您抽出宝贵时间,绝对不胜感激。

您需要验证并获取 form.py 密码。

form.py

class UserRegisterForm(forms.ModelForm):
"""
New User Form. Requires password confirmation.
"""
password1 = forms.CharField(
label='Password', widget=forms.PasswordInput
)
password2 = forms.CharField(
label='Confirm password', widget=forms.PasswordInput
)
class Meta:
model = User
fields = ['username', 'first_name', 'last_name', 'password']
# to make sure the password and the confirm password are equal
def clean_password2(self):
# Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords do not match")
return password2
# to make sure the added detail of the user in form is saved in database
def save(self, commit=True):
# Save the provided password in hashed format
user = super().save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user

view.py

def register(request):
form = UserRegisterForm(request.POST)
# if the data provided in the form is valid than save the form 
if form.is_valid():
user = form.save(commit=False)
user = form.save()
raw_password = form.cleaned_data.get('password1')
user = authenticate(request, email=user.email, password=raw_password)
if user is not None:
login(request, user)
return redirect('login')
return render(request, 'User/register.html', {'form': form})

希望这能让您了解密码确认的工作原理。

最新更新