现在我有这样的模特......
class myModel(models.Model):
title = models.CharField()
x_foo1_y = models.CharField()
x_foo2_y = models.CharField()
...视图
somevar = myModel.objects.get(title='title')
if x:
x = 'foo1'
else:
x = 'foo2'
...模板
{% if x == 'foo1' %}
{{ somevar.x_foo1_y }}
{% elif x == 'foo2' %}
{{ somevar.x_foo2_y }}
{% endif %}
我想要做的是在我的视图中添加一些逻辑,在某些情况下定义foo1或foo2然后我的模板可以减少以便更容易阅读......
{{ somevar.x_{{ x }}_y }}
但这并不起作用,我无法想办法让它发挥作用。有什么想法吗?
答案 0 :(得分:1)
要调用任意对象的任意方法,请创建一个简单的custom template tag:
from django import template
register = template.Library()
@register.simple_tag
def call_method(obj, method_name, *args):
method = getattr(obj, method_name)
return method(*args)
然后在模板中调用它:
{% load my_tags %}
{# equivalent of `somevar.x_foo1_y()` #}
{% call_method somevar 'x_foo1_y' %}
{# equivalent of `somevar.x_foo1_y('test')` #}
{% call_method somevar 'x_foo1_y' 'test' %}
{# equivalent of `somevar.x_foo1_y(othervar)` #}
{% call_method somevar 'x_foo1_y' othervar %}
{# equivalent of `somevar.x_foo1_y()` if `method_name == 'x_foo1_y'` #}
{% call_method somevar method_name %}
最后,相当于你的{% if %}
表达式:
{# make the `x_{{ x }}_y` method name #}
{% with 'x_'|add:x|add:"_y" as method_name %}
{% call_method somebar method_name %}
{% endwith %}
答案 1 :(得分:0)
我不确定x_foo1_y
和x_foo2_y
会是什么,但我猜你是在推广并询问如何处理这样的情况 。因此,我建议您使用custom template tags,这可能有助于通过委派其中的一些来减少模板逻辑。模板标签几乎可以做任何事情,所以我相信你可以移动很多像这样的逻辑。