我有一个这样的模型:
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
。我错过了什么?
答案 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 %}