标签内的django模板标签?试图减少模板逻辑

时间:2015-02-02 04:00:57

标签: django

现在我有这样的模特......

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 }}

但这并不起作用,我无法想办法让它发挥作用。有什么想法吗?

2 个答案:

答案 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_yx_foo2_y会是什么,但我猜你是在推广并询问如何处理这样的情况 。因此,我建议您使用custom template tags,这可能有助于通过委派其中的一些来减少模板逻辑。模板标签几乎可以做任何事情,所以我相信你可以移动很多像这样的逻辑。