63 python django django-templates django-models
我想在模板中调用我的模型中的函数,例如:
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
Run Code Online (Sandbox Code Playgroud)
当我想从模板中调用它时:假设在渲染时,我将channel_status_list作为
channel_status_list = ChannelStatus.objects.all()
{% for i in channel_status_list %}
{{ i.get_related_deltas(3) }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
这不起作用,我可以调用一个不消耗任何东西的函数,但是如果它有参数则无法找到该怎么做
干杯
Dan*_*man 82
您无法使用模板中的参数调用函数.您只能在视图中执行此操作.或者,您可以编写自定义模板过滤器,它可能如下所示:
@register.filter
def related_deltas(obj, epk):
return obj.get_related_deltas(epk)
Run Code Online (Sandbox Code Playgroud)
所以现在你可以在模板中执行此操作:
{% for i in channel_status_list %}
{{ i|related_deltas:3 }}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
sab*_*aba 36
如果该方法不需要任何参数,则可以使用@property装饰器并在模板中正常访问它.
class ChannelStatus(models.Model):
...
@property
def function_you_want_as_property(self):
mystring = ""
...
Run Code Online (Sandbox Code Playgroud)
对于> 1个参数,请使用简单标签:
@register.simple_tag
def related_deltas(obj, epk, second_arg):
return obj.get_related_deltas(epk, second_arg)
Run Code Online (Sandbox Code Playgroud)
模板:
{% for i in channel_status_list %}
{% related_deltas i 3 4 %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)
(请注意,语法从更改{{
为{%
)
可以采用位置参数(例如related_deltas i 3 second_arg=4 debug=true
)。
如果发现到处都有太多属性,或者您编写的所有其他方法都有模板过滤器,则在IRC上建议使用另一种解决方案,谢谢@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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
68994 次 |
最近记录: |