2016-01-21 72 views
2

我試圖通過user = request.user獲取正確的模型名稱時遇到一些問題,它顯示每個用戶像用戶,即使它是學生。 好了,更多的細節在這裏:Django定製用戶模型與Django多態

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager 

class UserManager(BaseUserManager): 
    pass 

class User(AbstractBaseUser): 
    objects = UserManager() 
    pass 

class Student(User): 
    pass 

當視圖代碼中,我試圖讓用戶= request.user,我需要得到用戶的型號,以顯示他們不同的看法。我用django-polymorphic試了一下,它適用於其他對象,但是當我嘗試從它那裏繼承時,一切都會停止,我不知道該怎麼做。 我想是這樣的:

class User(AbstractBaseUser, PolymorphicModel): 
    pass 

和經理:

class UserManager(BaseUserManager, PolymorphicManager): 
    pass 

,但它不工作,可能有人請告訴我如何在一起配置,或者說更好的方式來獲得正確的型號名稱request.user

+1

您需要使用語句來區分它們。用戶的獨特性如何? I.E.他們有不同的用戶羣體嗎?如果是這樣,你可以這樣做:'isStudent = request.user.groups.get(name ='Student')'。然後在'if'語句的視圖中使用它。 – Dandy

+0

我發現這裏沒有django-polymorphic的一些決定,但我想知道更多關於使用django多態。 [這是它](http://djbook.ru/forum/topic/3145/) –

+0

我以前從來沒有玩過多態,我目前沒有設備在今天晚些時候測試。你還有問題嗎? – Dandy

回答

0

我發現了一些decicion,這裏是代碼:

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

1以上方式:

def get_class_name(instance): 
    return instance.__class__.__name__ 

然後:

classname = get_class_name(user) 

但我不認爲這是很好的方式反正。 ..