Django表单-密码验证



我是Django的新手,昨天刚开始学习。我正在尝试创建一个注册表。我知道有内置的django注册表系统。但我自己也在努力。这是我的Views.py-

def register(request):
if request.user.is_authenticated:
return render(request, 'users.html', {})
else:
if (request.method=='POST'):
form=Register(request.POST)
if form.is_valid():
form.save()
return render(request,'home.html',{})
else:
return render(request,'register.html', {})

模板-

<form method="post">
{% csrf_token %}
<input type="text" name="username" placeholder="Username" required><br>
<input type="email" name="username" placeholder="Email" required><br>
<input type="password" placeholder="Password" name="password" required><br>
<input type="password" placeholder="Password" name="cpassword" required><br>
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="female">Female<br>
<input type="submit">
</form>

表格

class Register(forms.ModelForm):
class Meta:
model = Users
fields = ["username", "email", "password","gender"]

但由于form.py中没有确认密码字段。它不会超过form.is_valid((语句。我知道这可能很愚蠢。但就是找不到办法。

要检查密码验证,可以在views.py 中使用此算法

password = request.POST["password"]
confirmation = request.POST["cpassword"]
if password != confirmation:
return render(request, "register.html", {
"message": "Passwords must match."
})

并且在模板集合中形成类似的动作

form action="{% url 'register' %}"

您应该使用forms.py来使用Django表单,或者像在模板中那样使用手动表单。对于使用Django表单,我建议您阅读文档。https://docs.djangoproject.com/en/3.1/topics/forms/

扩展Django的User模型以添加您自己的字段

您可以阅读有关如何做到这一点的文档。

基本上:

# models.py
from django.db import models
from django.contrib.auth.models import User
class MyUser(models.Model):
GENDERS = [("F", "female"), ("M", "male")]
user = models.OneToOneField(User, on_delete=models.CASCADE)
gender = models.CharField(max_length=1, choices=GENDERS, default="F")

表格用于数据验证

现在有两个模型链接在一起:UserMyUser

您应该根据将存储数据的模型来验证每个数据。这只是意味着你需要两种形式:

# forms.py
from django import forms
from django.contrib.auth.models import User
from myapp.models import MyUser

class UserRegister(forms.ModelForm):
class Meta:
model = User
fields = ["username", "email", "password"]

class MyUserRegister(forms.ModelForm):
class Meta:
model = MyUser
fields = ["gender"]

这里没有更多的内容,如果您使用Django的ModelForm,让它自己做吧。

视图使用窗体并向其提供数据

因此,必须在视图上完成工作。

下面是一个如何做到这一点的例子:

# views.py
from django.shortcuts import render
from myapp.forms import MyUserRegister, UserRegister

def register(request):
if request.user.is_authenticated:
return render(request, 'users.html', {})
else:
if (request.method == 'POST'):
user_form = UserRegister(request.POST)
myuser_form = MyUserRegister(request.POST)
if user_form.is_valid() and myuser_form.is_valid():
user_form.save()
# Now that the User is saved, associate it to the MyUser object before saving
myuser_form.instance.user = user_form.instance
myuser_form.save()
return render(request,'home.html',{})
else:
return render(request,'register.html', {})

旁注

我把你的模板改成了";M〃;以及";F";作为匹配我的模型的选择:

<form method="post">
{% csrf_token %}
<input type="text" name="username" placeholder="Username" required><br>
<input type="email" name="username" placeholder="Email" required><br>
<input type="password" placeholder="Password" name="password" required><br>
<input type="password" placeholder="Password" name="cpassword" required><br>
<input type="radio" name="gender" value="M">Male
<input type="radio" name="gender" value="F">Female<br>
<input type="submit">
</form>

希望这能澄清你的一些问题。

最新更新