将自定义函数添加到M2M后代

时间:2016-05-24 11:59:00

标签: django django-models django-templates

我有一个这样的模型:

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()添加到我的manytomany 中间模型中:

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。我错过了什么?

2 个答案:

答案 0 :(得分:1)

这不是这样做的方式。

您可能需要查看custom managers

答案 1 :(得分: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 %}