2010-07-22 59 views
0

我想從auth應用中覆蓋Django用戶和組模型中的get_absolute_url方法。在Django中,如何通過代理模型正確訪問相關的代理模型

我的第一個想法是定義一個代理模式,但後來我發現,在usuario.groups的要素是的Group代替Grupo情況下,它也發生在grupo.user_set情況相同。所以,我擴大了代理模式有點

class Usuario(User): 
    class Meta: 
     proxy = True 

    @models.permalink 
    def get_absolute_url(self): 
     return ('ver_usuario', [self.id]) 

    @property 
    def grupos(self): 
     return Grupo.objects.filter(user=self.pk) 

    @grupos.setter 
    def grupos(self, valor): 
     self.groups = valor 


class Grupo(Group): 
    class Meta: 
     proxy = True 

    @models.permalink 
    def get_absolute_url(self): 
     return ('ver_grupo', [self.id]) 

    @property 
    def usuarios(self): 
     return Usuario.objects.filter(groups=self.pk) 

    @usuarios.setter 
    def usuarios(self, valor): 
     self.user_set = valor 

但後來我看到RelatedManager方法grupo.usuarios.create(username='test_usuario')將創建用戶,但它不會與組其關聯,這是因爲grupo.user_setManyRelatedManagergrupo.usuariosQuerySet。因此,也許創建一個特殊的ManyRelatedManager ...但在這一點上,我覺得這是越來越不必要的複雜。

由於我想替換get_absolute_url我只需在模板中使用url標記。但我想知道,如果我想添加其他方法,我該怎麼做?

+1

不好意思,用你的母語編寫代碼真是個壞主意。你似乎很熟練掌握英語,所以在今天的通用語言中保留你的代碼是一個很好的習慣。 – gruszczy 2010-07-22 15:35:23

+0

那麼,這個項目是本地的,只能在西班牙語環境中使用,並由西班牙人進行審查,所以我認爲使用西班牙語名稱是可取的。在這個例子中,我會在代碼示例中翻譯變量名稱,但是知道它們的含義似乎很簡單。 – naw 2010-07-22 15:45:49

回答

0

通過使用ABSOLUTE_URL_OVERIDES設置,可以基於每個安裝覆蓋get_absolute_url

+0

它適用於用戶,但Group沒有get_absolute_url方法,它不能覆蓋它。 – naw 2010-07-22 21:14:04