如何解决使用 AbstractBaseUser 时,“instance = my_model(user=user)”抛出“my_model.user”必须是“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,**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,**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
。我可以创建用户,更新他们,删除等,但不能过滤他们(似乎)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。