Python 使用django创建自定义用户后,当我尝试创建用户时,我的密码不显示或为空,或者您可以说没有

Python 使用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):

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


当我创建一个用户时,我的密码没有被添加到数据库中

看起来你试图覆盖UserCreationForm和UserChangeForm。如果是这样,那么即使您扩展了用户模型,也不需要这样做,因为默认UserCreationForm已经为您处理了密码验证,您所需要做的就是在form类中声明password1和password2

创建一个名为forms.py的新文件

forms.py

从django.contrib.auth.forms导入UserCreationForm 导入MyUser模型 从.models导入MyUser 类UserRegisterPerformUserCreationForm: 类MetaUserCreationForm: model=MyUser fields=['username'、'email'、'password1'、'password2'、…]您的MyUser字段 views.py

from.forms导入UserRegisterForm def注册表请求: 上下文={} form=userregister在此处执行更改 如果request.method==POST: form=UserRegisterFormrequest.POST此处更改 如果MyUser.objects.filteremail=request.POST.get'email'。计数==1: messages.errorrequest,“电子邮件已注册。” 返回renderrequest,register.html,{form:form} elif MyUser.objects.filterusername=request.POST.get'username'。计数==1: messages.error 请求,用户名已在使用中,但不相同 返回renderrequest,register.html,{'form':form} 其他: 如果form.u有效: 表单保存 返回重定向/ 上下文[形式]=形式 返回renderrequest、register.html、context