首页 > 解决方案 > 使用 AbstractBaseUser 时,“instance = my_model(user=user)”抛出“my_model.user”必须是“用户”实例

问题描述

我通过以下方法创建了一个 AbstractBaseUser

#users/managers.py

from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _


class CustomUserManager(BaseUserManager):
    """
    Custom user model manager where email is the unique identifiers
    for authentication instead of usernames.
    """
    def create_user(self, email, password, **extra_fields):
        """
        Create and save a User with the given email and password.
        """
        if not email:
            raise ValueError(_('Du skal indtaste en email'))
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password, **extra_fields):
        """
        Create and save a SuperUser with the given email and password.
        """
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError(_('Superuser must have is_staff=True.'))
        if extra_fields.get('is_superuser') is not True:
            raise ValueError(_('Superuser must have is_superuser=True.'))
        return self.create_user(email, password, **extra_fields)


#users/models.py
from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.utils.translation import gettext_lazy as _
from django.utils import timezone
from .managers import CustomUserManager
from django.conf import settings

class CustomUser(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(_('E-mail'), unique=True)
    is_active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(default=timezone.now)
    wants_email = models.BooleanField(_("Send mig emails"),default=True)
    is_active  = models.BooleanField(default=True)
    is_staff   = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    def __str__(self):
        return self.email

我的创作形式

#users/forms.py

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField(error_messages={"unique":"This user exists already!"})

    password1 = forms.CharField(
    widget=forms.PasswordInput,
    label="Password",
    )

    password2 = forms.CharField(
    label="Password (again)",
    widget=forms.PasswordInput,
    help_text="",
    )

    error_messages={
        "password_mismatch":_("Wups- not equal")
    }
    class Meta(UserCreationForm):
        model = CustomUser
        fields = ('email',)

然后是一个模型

#project/models.py

from django.db import models
from django.utils import timezone
from django.conf import settings

class my_model(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete = models.CASCADE,null=True)
    start_price = models.FloatField(default=0)
    last_price = models.FloatField(default=0)

我已经AUTH_USER_MODEL = 'users.CustomUser'在设置里设置了。

问题是,在我的一个观点中,我有

from .models import my_model
def MyView(request):
    user = request.user
    instance = my_model(user=user)  #This fails
    
    if request.method == "POST":
        form = my_form(request.POST,instance = instance)    
     .
     .
     .
    return render(request, "my_template.html",context=context)

并在本地运行(例如python manage.py runserver,一切正常,但是当推入生产时,我遇到了instance = my_model(user=user)错误

<SimpleLazyObject: <CustomUser: my_user@somemail.com>>": "my_model.user" must be a "User" instance.

注意:我开始只使用基本用户对象(例如,不是抽象用户),但自从我发现,我需要配置它,我已经擦除了我的数据库和所有迁移。创建了上面的模型,运行makemigrationsmigrate. 我可以创建用户、更新用户、删除用户等,但不能过滤它们(看起来)

标签: pythondjangodjango-users

解决方案


推荐阅读