2010-07-22 41 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