我一直在使用django中的默认用户模型进行了相当的升技,我意识到,如果我需要进一步增强它,我将不得不在django 1.5中创建自己的自定义用户模型。
我创建了自定义用户模型,并且我有一个允许用户登录的功能。 我认为我的自定义用户模型与我的功能不兼容,因为它不允许我执行request.user。我该如何解决这个问题,以便再次使用request.user?
视图
def LoginRequest(request):
form = LoginForm(request.POST or None)
if request.user.is_authenticated():
username = User.objects.get(username=request.user)
url = reverse('world:Profile', kwargs = {'slug': person.slug})
return HttpResponseRedirect(url)
if request.POST and form.is_valid():
user = form.authenticate_user()
login(request, user)
username= User.objects.get(username=request.user)
person = Person.objects.get(user=request.user)
url = reverse('world:Profile', kwargs = {'slug': person.slug})
return HttpResponseRedirect(url)
return render(request, 'login.html',{'form': form})
模型
class PersonManager(BaseUserManager):
def create_user(self, email,date_of_birth, username,password=None,):
if not email:
msg = 'Users must have an email address'
raise ValueError(msg)
if not username:
msg = 'This username is not valid'
raise ValueError(msg)
if not date_of_birth:
msg = 'Please Verify Your DOB'
raise ValueError(msg)
user = self.model(
email=PersonManager.normalize_email(email),username=username,date_of_birth=date_of_birth)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self,email,username,password,date_of_birth):
user = self.create_user(email,password=password,username=username,date_of_birth=date_of_birth)
user.is_admin = True
user.is_staff = True
user.is_superuser = True
user.save(using=self._db)
return user
class Person(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(verbose_name='email address',max_length=255,unique=True,db_index=True,)
username = models.CharField(max_length=255, unique=True)
date_of_birth = models.DateField()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username', 'date_of_birth',]
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
objects = PersonManager()
def get_full_name(self):
return self.email
def get_short_name(self):
return self.email
def __unicode__(self):
return self.email
答案 0 :(得分:115)
问题在于,User
引用了django.contrib.auth.models.User
,现在假设您已进入Custom User
pet.Person
settings.py
AUTH_USER_MODEL = "pet.Person"
您必须使用User
模型定义Custom User
,并且可以使用get_user_model
User
执行此操作
from django.contrib.auth import get_user_model
User = get_user_model()
现在您可以使用Custom User
模型,问题已修复。
答案 1 :(得分:5)
对于其他可能遇到此问题的人,我也只需在forms.py上执行此操作即可解决:
将此添加到forms.py文件的顶部
from .models import YourCustomUser
,然后将其添加到您的forms.py CustomUser
表单中:
class SignUpForm(UserCreationForm):
#profile_year = blaaa blaa blaaa irrelevant.. You have your own stuff here don't worry about it
# here is the important part.. add a class Meta-
class Meta:
model = YourCustomUser #this is the "YourCustomUser" that you imported at the top of the file
fields = ('username', 'password1', 'password2', #etc etc, other fields you want displayed on the form)
大笔记,请注意:
此代码适用于我的情况。我有一个注册用户的视图,这里有一个问题,我已经解决了,我没有尝试过用于登录用户。
include = ()
部分是必需的,或者您可以添加exclude = ()
,但必须有一个
答案 2 :(得分:1)
重要的告诫,以更新上述解决方案...
如果您遇到此类问题,则可能已经在网络上尝试了各种解决方案,告诉您将AUTH_USER_MODEL = users.CustomUser
添加到settings.py
,然后将以下代码添加到views.py
{{ 1}}和其他任何调用forms.py
的文件:
User
然后在出现错误时挠头:
from django.contrib.auth import get_user_model
User = get_user_model()
只要您的代码引用Manager isn't available; 'auth.User' has been swapped for 'users.User'
,例如:
User
因为您知道已经将User.objects.get()
放入了自定义用户类中(objects = UserManager()
是扩展了UserManager
的自定义管理器的名称)。
事实证明:
BaseUserManager
不等同于:
User = get_user_model() # somewhere at the top of your .py file
# followed by
User.objects.get() # in a function/method of that same file
也许不直观,但是事实证明,在python中,在导入时执行一次get_user_model().objects.get() # without the need for User = get_user_model() anywhere
并不会导致在后续调用中定义User = get_user_model()
(即,它不会变成{ {1}}转换为“常数”,如果您来自C / C ++背景,可能会期望它;这意味着User
的执行在导入时发生,但随后被取消引用在随后对该文件中的类或函数/方法进行调用之前)。
总而言之,在所有引用User
类的文件中(例如,调用函数或变量,例如User = get_user_model()
User
User.objects.get()
等):< / p>
User.objects.all()
希望这有助于节省其他人的时间...
答案 3 :(得分:0)
在我的情况下,以上提供的所有解决方案均无效。如果您使用的是Django 3.1版,则还有另一种解决方案:
在auth / forms中,注释掉第10行,然后将第104和153行中的模型更改为您定义的模型。
答案 4 :(得分:0)
在forms.py
将 from django.contrib.auth.models import User
更改为
from djangi.contrib.auth import get_user_model
然后在顶部添加以下代码
User = get_user_model()