Django模板系统,调用模型中的函数

我想从模型中调用一个函数,例如:

class ChannelStatus(models.Model): .............................. .............................. def get_related_deltas(self,epk): mystring = "" if not self.get_error_code_delta(epk): return mystring else: for i in self.get_listof_outage(): item = i.error_code.all() for x in item: if epk == x.id: mystring= mystring +" "+str(i.delta()) return mystring 

而当我想从模板中调用这个:假设渲染时,我传递给channel_status_list

 channel_status_list = ChannelStatus.objects.all() {% for i in channel_status_list %} {{ i.get_related_deltas(3) }} {% endfor %} 

这不起作用,我可以调用一个不消耗任何东西的函数,但是如果它有参数,它就不会find该做什么。

干杯

您无法使用模板中的参数调用函数。 你只能在视图中做到这一点。 或者,你可以写一个自定义的模板filter ,看起来像这样:

 @register.filter def related_deltas(obj, epk): return obj.get_related_deltas(epk) 

所以现在你可以在模板中做到这一点:

 {% for i in channel_status_list %} {{ i|related_deltas:3 }} {% endfor %} 

如果该方法不需要任何参数,则可以使用@property装饰器并在模板中正常访问它。

 class ChannelStatus(models.Model): ... @property def function_you_want_as_property(self): mystring = "" ... 

如果你发现有太多的属性到处乱跑,或者你有其他方法的模板filter,你可以在IRC上build议另一个解决scheme,谢谢@FunkyBob。 这是一个很好的,呃,时髦,但在某些情况下,这是很好的。

  class MethodProxy(object): """For consolidating into 1 method the calling of methods with various single args (suitable dictionary keys) class MyModel(models.Model): ... def magic(self, value): # Free the ponies def thing(self): return MethodProxy(self.magic) # Usage >>> m = MyModel() ... >>> m.thing['value'] == m.magic('value') # template {{ m.thing.value }} """ def __init__(self, method): self.method = method def __getitem__(self, key): return self.method(key) 

对于> 1的参数,使用简单的标签 :

 @register.simple_tag def related_deltas(obj, epk, second_arg): return obj.get_related_deltas(epk, second_arg) 

模板:

 {% for i in channel_status_list %} {% related_deltas i 3 4 %} {% endfor %} 

(请注意语法从{{{% }

可以采取位置参数(例如related_deltas i 3 second_arg=4 debug=true )。

另一种select是定义一个属性。 请参阅http://adam.gomaa.us/blog/2008/aug/11/the-python-property-builtin/

你写的function可以做任何你想做的事情。 您使它成为只读属性。 您从模板中调用该属性。

Etvoilà!!!!