【问题标题】:Django Form- Password ValidationDjango 表单 - 密码验证
【发布时间】:2020-12-08 22:13:31
【问题描述】:

我是 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>

form.py

class Register(forms.ModelForm):

    class Meta:
        model = Users
        fields = ["username", "email", "password","gender"]

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

【问题讨论】:

    标签: python django forms web input


    【解决方案1】:

    要检查密码验证,你可以在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-forms,就像您在模板中所做的那样。 对于使用 Django 表单,我建议您阅读文档。 https://docs.djangoproject.com/en/3.1/topics/forms/

    【讨论】:

    • 您还应该看看docs.djangoproject.com/en/3.1/ref/forms/validation 以及如何覆盖clean()。您可能需要从 clean_data 中删除 cpassword。
    • 我查看了这篇文章,我能够找到 self.add_error('cpassword',msg) 来删除一个字段,但它仍然不起作用。
    【解决方案2】:

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

    您可以阅读the documentation 了解如何执行此操作。

    基本上:

    # 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>
    

    希望这能澄清你的问题。

    【讨论】:

      猜你喜欢
      • 2019-04-14
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 2017-12-05
      • 2014-05-12
      相关资源
      最近更新 更多