2016-05-24 22 views
0

我有这样一个模型:添加自定义功能的M2M后代

class BaseModel(models.Model): 
    date_v_fin = models.DateTimeField(
     default=None, 
     null=True, 
     editable=True, 
     verbose_name=_(u"V. end"), 
     blank=True 
    ) 

class Personne(BaseModel): 
    types_permis = models.ManyToManyField(
     TagTraduit, blank=True, default=None, symmetrical=False, 
     through='PersonneTypepermis', 
     related_name='personne_typepermis') 

我所试图做的是重写ManyToManyField添加自定义的功能是这样的:

class ManyToManyStillValid(models.ManyToManyField): 

    def all_valid(self): 
     print "i came here" 
     return self.all().filter(date_v_fin__null=True) 

这样,我想我可能是能够在我的模板使用这样的:

{% for item in personne.types_permis.all_valid %} 
    <br/>{{ item }} 
{% empty %} 
    <br/>{% trans 'No driving licence provided' %} 
{% endfor %} 

但它不工作,乐趣永远不会调用all_valid()。我错过了什么?


更新 阅读的答案后,我已经尝试使用这样的定制经理:

首先创建我的自定义经理:

class ObjectsStillValidManager(models.Manager): 
    def still_valid(self): 
     return super(ObjectsStillValidManager, self).get_queryset().filter(
      date_v_fin__exact=None) 

然后加入objects = ObjectsStillValidManager()我多对多中间型号:

class PersonneTypepermis(BaseModel): 
    personne = models.ForeignKey(Personne, verbose_name=_(u'Person')) 
    type_permis = models.ForeignKey(TagTraduit, verbose_name=_(u'Licence')) 
    objects = ObjectsStillValidManager() 

    def __str__(self): 
     return _(u'{}/{}').format(self.personne, self.type_permis) 

但似乎我不能叫still_valid这样的:

{% for item in personne.types_permis.still_valid %} 
{% endfor %} 

因为still_valid永远不会被调用。我错过了什么?

回答

1

这不是做这件事的方法。

你可能想看看custom managers

+0

谢谢您的回答添加此,我已经编辑我的问题,我没有设法使用自定义管理器。 –

+0

不要在still_valid方法中使用super,只是返回self.get_queryset()。filter(date_v_fin__isnull = True) –

+0

我检查你的答案是否有效,如果你不介意,我可以将我的工作解决方案添加到你的答案? –

0

这是错误的做法来定义的型号功能,使用custom managers这一点。

现在的问题是你不能从模板(HTML页面)调用函数调用该功能的查看和渲染数据在context

随着视图上下文数据
_list_of_data = personne.types_permis2.all_valid() {'_list_of_data':_list_of_data}

现在在上下文中的渲染功能
然后迭代它的HTML {% for item in _list_of_data %} .... .... {% endfor %}

+0

谢谢你的回答,我编辑了我的问题,我没有设法使用自定义管理器。 –