После создания пользовательского пользователя с помощью django, когда я попытался создать пользователя, мой пароль не отображается или он пустой, или вы можете сказать, что его нет

#python #html #django

#python #HTML #django

Вопрос:

Мой пользовательский пользователь django возвращает пустой или нет в качестве пароля после создания пользователя, но я не могу найти никаких проблем, я новичок в этом, я провел свое исследование, но это безнадежно, так что помогите мне

Вот мои модели

 from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager


# Create your models here.

class MyUserManager(BaseUserManager):
    def create_user(self, username, email, first_name, last_name,  date_of_birth, gender,  password=None):
        if not first_name:
            raise ValueError("Users must have a first name")
        if not last_name:
            raise ValueError("Users must have a last name")
        if not email:
            raise ValueError('Users must have an email address')
        if not gender:
            raise ValueError("Users must have a gender")
        if not date_of_birth:
            raise ValueError("You Must Enter your date of birth")

        user = self.model(
            username=username,
            email=self.normalize_email(email),
            first_name=first_name,
            last_name=last_name,
            date_of_birth=date_of_birth,
            gender=gender,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, username, email, first_name, last_name,  date_of_birth, gender,  password=None):
        user = self.create_user(
            username,
            email,
            first_name,
            last_name,
            date_of_birth,
            gender,
        )
        user.set_password(password)
        user.is_admin = True
        user.save(using=self._db)
        return user


class MyUser(AbstractBaseUser):
    username = models.CharField(max_length=50, unique=True)
    email = models.EmailField(max_length=254, unique=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    date_of_birth = models.DateField()
    gender_choices = [
        ("male", "Male"),
        ("female", "Female"),
        ("others", "Others")
    ]
    gender = models.CharField(max_length=50, choices=gender_choices)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['first_name',
                       'email', 'last_name',  'date_of_birth', 'gender']

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def get_full_name(self):
        return f"{self.first_name} {self.last_name}"

    @property
    def is_staff(self):
        return self.is_admin

  

Вот мой администратор

 from django.contrib import admin
from django import forms
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField
from django.core.exceptions import ValidationError
from django.contrib.auth import get_user_model
# Register your models here.


from .models import MyUser


class UserCreationForm(forms.ModelForm):

    password1 = forms.CharField(label="password", widget=forms.PasswordInput)
    password2 = forms.CharField(
        label="password confirmation", widget=forms.PasswordInput)

    class Meta:
        model = MyUser
        fields = ('username', "email", "first_name", "last_name",
                  "gender", "date_of_birth")

        def clean_password2(self):
            password1 = self.cleaned_data.get("password1")
            password2 = self.cleaned_data.get("password2")
            if password1 and password2 and password1 != password2:
                raise ValidationError("Password don't match")
            return password2

        def save(self, commit=True):
            user = super().save(commit=False)
            user.set_password(self.cleaned_data["password1"])
            if commit:
                user.save()
            return user


class UserChangeForm(forms.ModelForm):

    passwrod = ReadOnlyPasswordHashField()

    class Meta:
        model = MyUser
        fields = ('username', "email", "first_name", "last_name",
                  "gender", "date_of_birth", 'is_active', "is_admin")

        def clean_password(self):
            return self.initial["password"]


class UserAdmin(BaseUserAdmin):
    form = UserChangeForm
    add_form = UserCreationForm

    list_display = ('username', 'email', 'first_name', 'password',
                    'last_name', 'is_admin', 'is_active')
    list_filter = ('is_admin',)
    fieldsets = (
        (None, {
            "fields": ('username', 'email', 'first_name',
                       'last_name', 'is_admin', 'is_active',  'date_of_birth', 'gender'),
        }),
    )
    add_fieldsets = (
        (None, {
            "fields": ('username', 'email', 'first_name',
                       'last_name', 'is_admin', 'is_active', 'password1', 'password2', 'date_of_birth', 'gender'),
        }),
    )

    search_fields = ('email',)
    ordering = ('email',)
    filter_horizontal = ()


User = get_user_model()
admin.site.register(User, UserAdmin)

  

Вот мои взгляды

 def registerUser(request):
    context = {}
    form = UserCreationForm()
    if request.method == "POST":
        form = UserCreationForm(request.POST)
        if MyUser.objects.filter(email=request.POST.get('email')).count() == 1:
            messages.error(request, 'Email is already registerd.')
            return render(request, "register.html", {"form": form})
        elif MyUser.objects.filter(username=request.POST.get('username')).count() == 1:
            messages.error(
                request, "Username already in Use choce differnt one")
            return render(request, "register.html", {'form': form})
        else:
            if form.is_valid:
                form.save()
                return redirect("/")
    context["form"] = form
    return render(request, "register.html", context)
  

Вот мой шаблон

 {% load static %}
<head>
  <link rel="stylesheet" href="{% static 'css/login_and_register.css' %}" />
  <style>
    select {
      margin: 5px;
      text-align: center;
      font-size: 20px;
    }
    select option {
      text-align: center;
    }
    .error {
      color: #fff;
      background-color: rgb(243, 70, 70);
      font-size: 18px;
      text-align: center;
      transform: translateX(-100px);
    }
  </style>
</head>
<form action="{% url 'register' %}" id="registrationForm" method="POST">
  <h1 id="formHeader">Register User</h1>
  <p>This Register is page for only Staff</p>
  <div id="fields">
    {% csrf_token %}
    <label for="username">User Name:</label>
    {{form.username}}
    <label for="firstname"> First Name: </label>
    {{form.first_name}}
    <label for="lastname">Last Name:</label>
    {{form.last_name}}
    <label for="email">Email:</label>
    {{form.email}}
    <label for="password1">Password:</label>
    {{form.password1}}
    <label for="password2">Conform Password:</label>
    {{form.password2}}
    <label for="gender">Gender</label>
    {{form.gender}}
    <label for="Date">Date of Birth:</label>
    {{form.date_of_birth}}
    <div></div>
    <div id="message"></div>
    {% if messages %}
    <div></div>
    <ul class="messages">
      {% for message in messages %}
      <li{% if message.tags %} class="{{ message.tags }}" {% endif %}>
        {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %}
        {{ message }}
        </li>
        {% endfor %}
    </ul>
    {% endif %}
  </div>
  <p>If you already have an Account click <a href="">Log-In</a></p>
  <button type="submit" id="submitBtn">Create User</button>
</form>
<script>
  var inputs = document.querySelectorAll("input");
  inputs[1].placeholder = "Enter your User Name";
  inputs[2].placeholder = "Enter Your First Name";
  inputs[3].placeholder = "Enter Your Last Name";
  inputs[4].placeholder = "Enter Your Email Id";
  inputs[5].placeholder = "Enter Your Password";
  //inputs[5].setAttribute("type", "password");
  inputs[6].placeholder = "Re-enter Your Password";
  inputs[7].setAttribute("type", "date");
  document
    .getElementById("registrationForm")
    .addEventListener("submit", (e) => {
      let messeges;
      let condition = true;
      if (inputs[5].value != inputs[6].value) {
        condition = false;
        messeges = "Password didn't matched";
        document.getElementById("message").innerText =
          "Password didn't matched";
        document.getElementById("message").classList.add("error");
      } else if (inputs[5].value == inputs[6].value) {
        condition = true;
      }
      if (condition == false) {
        e.preventDefault();
      }
      console.log(condition);
    });
</script>

  

когда я создаю пользователя, мой пароль не добавляется в базу данных

Ответ №1:

Похоже, вы пытаетесь переопределить UserCreationForm и UserChangeForm . Если это так, то вам не нужно этого делать, даже если вы расширили модель пользователя, потому что default UserCreationForm уже обработал проверку пароля для вас, и все, что вам нужно сделать, это объявить password1 и password2 в классе form .

Создайте новый файл с именем forms.py .

forms.py

 from django.contrib.auth.forms import UserCreationForm

# import MyUser model
from .models import MyUser

class UserRegisterForm(UserCreationForm):
    class Meta(UserCreationForm):
        model = MyUser
        fields = ['username', 'email', 'password1', 'password2', ..] # your MyUser fields
  

views.py

 from .forms import UserRegisterForm

def registerUser(request):
    context = {}
    form = UserRegisterForm() # change here
    if request.method == "POST":
        form = UserRegisterForm(request.POST) # change here
        if MyUser.objects.filter(email=request.POST.get('email')).count() == 1:
            messages.error(request, 'Email is already registerd.')
            return render(request, "register.html", {"form": form})
        elif MyUser.objects.filter(username=request.POST.get('username')).count() == 1:
            messages.error(
                request, "Username already in Use choce differnt one")
            return render(request, "register.html", {'form': form})
        else:
            if form.is_valid:
                form.save()
                return redirect("/")
    context["form"] = form
    return render(request, "register.html", context)