Форма Django- проверка пароля

#python #django #forms #web #input

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

form.py

 class Register(forms.ModelForm):

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

Но поскольку в поле подтверждения пароля нет form.py . Он не проходит мимо инструкции form.is_valid().
Я знаю, что это может быть глупо. Но просто не могу найти способ сделать это.

Ответ №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' %}"
  

Вы должны либо использовать Django-forms с помощью forms.py или ручная форма, как вы сделали в шаблоне.
Для использования форм Django я рекомендую вам прочитать документы. https://docs.djangoproject.com/en/3.1/topics/forms /

Комментарии:

1. Вам также следует взглянуть на docs.djangoproject.com/en/3.1/ref/forms/validation и как переопределить clean(). Вероятно, вам потребуется удалить cpassword из cleaned_data.

2. я просмотрел статью, и мне удалось найти self.add_error (‘cpassword’, msg), чтобы удалить поле, но все равно это не работает.

Ответ №2:

Расширьте User модель Django, чтобы добавить свои собственные файлы

Вы можете прочитать документацию о том, как это сделать.

В основном:

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

Формы предназначены для проверки данных

У вас есть две модели, которые теперь связаны вместе: User и MyUser .

Вы должны проверять все данные на соответствие модели, которая будет их хранить. Это просто означает, что вам нужны две формы:

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

Надеюсь, это немного прояснит ваши вопросы.