将自定义函数添加到 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从不被调用。我错过了什么?

这不是这样做的方法。

您可能想看看自定义管理器

这是在模型上定义函数的错误方法,为此使用自定义管理器。

现在的问题是您无法从模板(html 页面)调用函数,在视图上调用该函数并在上下文中呈现数据。

查看
上下文数据 _list_of_data = personne.types_permis2.all_valid() {'_list_of_data':_list_of_data}

现在在渲染函数的上下文中添加它
然后在 html 上迭代它 {% for item in _list_of_data %} .... .... {% endfor %}

最新更新