使用自定义字段扩展User模型(与Django的身份验证应用程序捆绑在一起)的最佳方法是什么?我也可能希望使用该电子邮件作为用户名(用于身份验证).
我有以下方法:
def _attempt(actor):
if actor.__class__ != User:
raise TypeError
Run Code Online (Sandbox Code Playgroud)
从视图中调用:
self.object.attempt(self.request.user)
Run Code Online (Sandbox Code Playgroud)
如您所见,_attempt方法期望actor是类型django.contrib.auth.models.User,但是对象看起来是类型django.utils.functional.SimpleLazyObject.为什么会这样?更重要的是,如何将LazyObject(显然是一种User对象的包装器)转换为User对象?
有关详细信息,Request.user请访问:https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.user此文档似乎表明request.user应该是一个User对象......
======进行后期编辑=====
我现在有以下方法:
def _attempt(obj, action, actor, msg):
actor.is_authenticated()
if isinstance(actor, LazyObject):
print type(actor)
Run Code Online (Sandbox Code Playgroud)
我正在传递一个用户,但if条件仍然是真的,演员仍然是LazyObject.为什么会这样?
我制作了一个自定义配置文件模型,如下所示:
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.ForeignKey('User', unique=True)
name = models.CharField(max_length=30)
occupation = models.CharField(max_length=50)
city = models.CharField(max_length=30)
province = models.CharField(max_length=50)
sex = models.CharField(max_length=1)
Run Code Online (Sandbox Code Playgroud)
但是当我跑步时manage.py syncdb,我得到:
myapp.userprofile:'user'与模型User有关系,它没有安装或者是抽象的.
我也尝试过:
from django.contrib.auth.models import BaseUserManager, AbstractUser
Run Code Online (Sandbox Code Playgroud)
但它给出了同样的错误.哪里我错了,如何解决这个问题?
我只想在Django CRUD管理站点的用户列表中添加订阅日期.我怎样才能做到这一点 ?
谢谢您的帮助
如何让您的模板/视图识别登录用户是否是超级用户?
我的表单(在模板中)有一些按钮,如果用户不是超级用户,我想要完全隐藏
你会怎么做呢?
django django-templates django-models django-forms django-users
可能重复:
以Django格式获取请求数据
我的访客模型的一部分:
class Guest(models.Model):
event = models.ForeignKey(Event, related_name='guests')
user = models.ForeignKey(User, unique=True, related_name='guests')
...
Run Code Online (Sandbox Code Playgroud)
表格以获得来宾的回复:
class RSVPForm(forms.Form):
attending_d= forms.ChoiceField(choices=VISIBLE_ATTENDING_CHOICES, initial='yes', widget=forms.RadioSelect)
attending_b = forms.ChoiceField(choices=VISIBLE_ATTENDING_CHOICES, initial='yes', widget=forms.RadioSelect)
number_of_guests = forms.IntegerField(initial=0)
comment = forms.CharField(max_length=255, required=False, widget=forms.Textarea)
....
def save(self):
guest = self.guest_class.objects.get(user=1)
guest.attending_status_d = self.cleaned_data['attending_d']
guest.attending_status_b = self.cleaned_data['attending_b']
guest.number_of_guests = self.cleaned_data['number_of_guests']
guest.comment = self.cleaned_data['comment']
guest.save()
return guest
Run Code Online (Sandbox Code Playgroud)
问题出在save方法中.如何将访客与当前登录的用户相关联?
guest = self.Guest.objects.get(user=1)
Run Code Online (Sandbox Code Playgroud)
而不是user=1我需要具有当前登录用户的id.
谢谢!
我正在通过扩展Django User模型找到有关是否使用OneToOneField(User)或ForeignKey(User, unique=True)创建UserProfile模型的相互矛盾的信息.
使用它更好吗?:
class UserProfile(models.Model):
user = models.ForeignKey(User, unique=True)
Run Code Online (Sandbox Code Playgroud)
或这个?:
class UserProfile(models.Model):
user = models.OneToOneField(User)
Run Code Online (Sandbox Code Playgroud)
在Django的文件规定OneToOneField,而Django的书例子使用ForeignKey.
詹姆斯贝内特也有两篇博客文章,也提供了相互矛盾的例子:
在前一篇文章中,Bennett提供了一些原因,为什么他转而使用ForeignKey而不是OneToOneField,但我不太明白,特别是当我看到推荐相反的其他帖子时.
我很想知道你的偏好和原因.或者,它甚至重要吗?
我想在Django的默认用户模型中添加一个新函数,用于检索模型类型的相关列表.
这样的Foo模型:
class Foo(models.Model):
owner = models.ForeignKey(User, related_name="owner")
likes = models.ForeignKey(User, related_name="likes")
Run Code Online (Sandbox Code Playgroud)
........
#at some view
user = request.user
foos= user.get_related_foo_models()
Run Code Online (Sandbox Code Playgroud)
怎么能实现这一目标?
我正在使用以下代码扩展基于文档的User类:
from django.contrib.auth.models import AbstractUser
class MyUser(AbstractUser):
some_extra_data = models.CharField(max_length=100, blank=True)
Run Code Online (Sandbox Code Playgroud)
但是,我将返回以下错误
Reverse accessor for 'User.groups' clashes with reverse accessor for 'MyUser.groups'.
HINT: Add or change a related_name argument to the definition for 'User.groups' or 'MyUser.groups'.
Run Code Online (Sandbox Code Playgroud)
我理解通过向FK添加related_name来解决此类冲突.在这种情况下我该如何解决?
最初,我像这样开始我的UserProfile:
from django.db import models
from django.contrib.auth.models import User
class UserProfile(models.Model):
user = models.OneToOneField(User)
verified = models.BooleanField()
mobile = models.CharField(max_length=32)
def __unicode__(self):
return self.user.email
Run Code Online (Sandbox Code Playgroud)
哪个适用于AUTH_PROFILE_MODULE = 'accounts.UserProfile'设置settings.py.
但是,我的网站中有两种不同的用户,个人和企业,每个都有自己独特的属性.例如,我希望我的个人用户只有一个用户,因此拥有user = models.OneToOneField(User),而对于企业,我希望他们有多个用户与相同的个人资料相关,所以我会user = models.ForeignKey(User)改为.
所以我考虑将模型分成两个不同的模型,IndivProfile并且CorpProfile都继承自UserProfile将模型特定的属性移动到相关的子模型中.对我来说似乎是一个好主意并且可能会有效,但是我无法指定AUTH_PROFILE_MODULE这种方式,因为我有两个不同用户的用户配置文件.
我也考虑过这样做,UserProfile从多个类(模型)继承,如下所示:
class UserProfile(IndivProfile, CorpProfile):
# some field
def __unicode__(self):
return self.user.email
Run Code Online (Sandbox Code Playgroud)
这样我就可以设置AUTH_PROFILE_MODULE = 'accounts.UserProfile'并解决它的问题.但是看起来它看起来不会起作用,因为python中的继承从左到右工作,所有变量IndivProfile都占主导地位.
当然,我总是可以将一个模型IndivProfile和CorpProfile变量全部混合在一起,然后我会在必要时使用所需的模型.但这对我来说看起来并不干净,我宁愿让它们隔离并在适当的地方使用适当的模型.
的任何建议清洁这样的方式?