【问题标题】:Manager isn't available; 'auth.User' has been swapped for 'diabetes.UserSignupModel'经理不可用; 'auth.User' 已替换为 'diabetes.UserSignupModel'
【发布时间】:2020-05-16 15:38:52
【问题描述】:

我使用AbstractBaseUser, BaseUserManager 制作了一个自定义用户模型,并使用该模型制作了一个注册表单。但是每当我尝试加载注册表单时,它都会给我一个错误。我的应用名称是糖尿病。我在settings.py中添加了应用程序安装应用程序,还添加了AUTH_USER_MODEL='diabetes.UserSignupModel'。我可以手动在数据库中添加数据。

models.py

from django.db import models

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



class SignUpManager(BaseUserManager):
    def create_user(self, email, username, age, name, password=None):
        if not email:
            raise ValueError("insert user")
        if not username:
            raise ValueError("insert username")
        if not name:
            raise ValueError("insert name")
        if not age:
            raise ValueError("insert age")
        user = self.model(
            email=self.normalize_email(email),
            username=username,
            age=age,
            name=name,
        )
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, age, name, password):

        user = self.create_user(
            email=self.normalize_email(email),
            username=username,
            password=password,
            age=age,
            name=name,
        )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True

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


class UserSignupModel(AbstractBaseUser):
    email = models.EmailField(verbose_name="email", max_length=60, unique=True)
    age = models.CharField(max_length=15)
    name = models.CharField(max_length=15)
    username = models.CharField(max_length=15, unique=True)
    date_joined = models.DateTimeField(verbose_name="date joined", auto_now_add=True)
    last_login = models.DateTimeField(verbose_name="last login", auto_now=True)

    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = "username"
    REQUIRED_FIELDS = ["email", "name", "age"]
    objects = SignUpManager()

    def __str__(self):
        return self.email

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

    def has_module_perms(self, app_label):
        return True
#migrate --run-syncdb in case no work

admin.py

from django.contrib import admin

# Register your models here.
from diabetes.models import UserSignupModel
admin.site.register(UserSignupModel)

forms.py

from django import forms

from django.contrib.auth.forms import UserCreationForm
from diabetes.models import UserSignupModel


class UserSignupForm(UserCreationForm):
    email=forms.EmailField(max_length=50,help_text="add a valid email address")
    name=forms.CharField(max_length=50,help_text="add a valid name")
    age=forms.IntegerField()

    class meta:
        model=UserSignupModel
        fields=("email","username","name","age","password1","password2")

【问题讨论】:

  • 您是否在创建新的用户模型之前迁移了您的项目?
  • 不确定!

标签: python django


【解决方案1】:

在 UserSignupForm 中,它是 class Meta: 而不是 class meta: 并确保在引用您的用户模型时,您使用的是 settings.AUTH_USER_MODEL。

from django.conf import settings

class UserSignupForm(UserCreationForm):
    email=forms.EmailField(max_length=50,help_text="add a valid email address")
    name=forms.CharField(max_length=50,help_text="add a valid name")
    age=forms.IntegerField()

    class Meta:
        model=settings.AUTH_USER_MODEL
        fields=("email","username","name","age","password1","password2")

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2019-07-20
    • 2018-07-27
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多