python - 使用 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.
注意:我开始只使用基本用户对象(例如,不是抽象用户),但自从我发现,我需要配置它,我已经擦除了我的数据库和所有迁移。创建了上面的模型,运行makemigrations
和migrate
. 我可以创建用户、更新用户、删除用户等,但不能过滤它们(看起来)
解决方案
推荐阅读
- python - 构造函数中的 Magic Mock 函数
- regex - 如何用 Google 表格中的公式用单个字符替换一个字符组,用另一个单个字符替换另一个字符组?
- c# - 根据 Unity 中的世界位置隐藏所有孩子
- java - 即使从最近的应用程序中清除应用程序或在 Red MI 设备上关闭应用程序,也可以继续服务
- google-cloud-platform - 谷歌云是否支持 Tibco EMS?如果没有,如何在谷歌云中运行 EMS 代理?
- java - SQL Query with Entity Manager
- python - SQLAlchemy 最多获得 N 个结果,其中每个类别少于 M
- c# - Regex Finding Name and Surname on the String for ID Card
- java - App crashes when trying to create a list of files from a directory
- wordpress - 通过 cron 调用的 wp_insert_post 重复帖子而不是更新它们