在尝试通过user = request.user
获取正确的模型名称时遇到一些问题,它会向用户显示每个用户,即使它是学生。
好的,这里有更多细节:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
class UserManager(BaseUserManager):
pass
class User(AbstractBaseUser):
objects = UserManager()
pass
class Student(User):
pass
当在视图代码中我尝试获取user = request.user时,我需要获取用户模型名称以向他们显示不同的视图。我尝试使用django-polymorphic,它适用于其他对象但是当我尝试从它继承时,一切都会失败,我不明白该怎么做。 我试过这样的事情:
class User(AbstractBaseUser, PolymorphicModel):
pass
和经理:
class UserManager(BaseUserManager, PolymorphicManager):
pass
但它不起作用,有人可以告诉我如何配置它们或说出更好的方法从request.user获取正确的模型名称
答案 0 :(得分:0)
我发现了一些决定,这里是代码:
class InheritanceMetaclass(ModelBase):
def __call__(cls, *args, **kwargs):
obj = super(InheritanceMetaclass, cls).__call__(*args, **kwargs)
return obj.get_object()
class User(AbstractBaseUser):
__metaclass__ = InheritanceMetaclass
object_class = models.CharField(max_length=20)
objects = BaseUserManager()
def get_object(self):
if not self.object_class or self._meta.model_name == self.object_class:
return self
else:
return getattr(self, self.object_class)
def save(self, *args, **kwargs):
if not self.object_class:
self.object_class = self._meta.model_name
super(User, self).save( *args, **kwargs)
# inherits
class User1(User):
text1 = models.CharField(max_length=20)
text2 = models.CharField(max_length=20)
class User2(User):
text3 = models.CharField(max_length=20)
text4 = models.CharField(max_length=20)
它接缝有效但我相信应该是更好的方法。
现在,您可以在object_class属性user.object_class
这里有另外一种方式:
def get_class_name(instance):
return instance.__class__.__name__
然后:
classname = get_class_name(user)
但我不认为这是好方法......