将字符串评估为模板标记 - Django

时间:2012-11-29 08:07:37

标签: django django-templates

我有一个Django模板,其中包含一个模板标记,它接受一个变量(shop.id)并返回两个字符串中的一个,具体取决于商店是否在数据库模型中,如下所示

{% is_shop_claimed shop.id %}

模板标记返回的两个可能的字符串是

return '<p>Taken</p>'

return '<a href="/claim_shop/{{shop.id}}/">Claim shop now</a>'

当代码运行时,如果返回第二个字符串,它将出现在模板中(在浏览器中查看页面源),如

<a href="/claim_shop/{{shop.id}}/">Claim shop now</a>

并在浏览器中显示为此类链接

立即索赔商店

问题是 Django模板引擎将href 中的shop.id评估为

对于商店123,链接应该如此显示,例如

<a href="/claim_shop/123/">Claim shop now</a>

我已经检查了Django文档中的过滤器,以便应用于模板标记或模板中的字符串,以便字符串不会被转义,但没有运气。

我查看了this,但似乎应该有一种简单的方法在模板中评估{{shop.id}}。

我还使模板标签返回Bool而不是两个字符串,将演示文稿保留在模板中,就像我希望的那样,但在模板标签周围使用if语句

{% if is_shop_claimed shop.id %}
    <p>Taken</p>
{% elif not is_shop_claimed shop.id %}
    <a href="/claim_shop/{{shop.id}}/">Claim shop now</a>
{% endif %}

不起作用,因为我无法将模板标记放在if语句中。

有关如何将{{shop.id}}评估为数字的任何建议吗?任何帮助,将不胜感激。 我正在学习Django和Python,我花了好几个小时来处理这个问题。

2 个答案:

答案 0 :(得分:2)

您正在传递该值,因此请将其替换为。

return '<a href="/claim_shop/%s/">Claim shop now</a>' % (shop_id,) # or however you refer to it in the code

答案 1 :(得分:0)

我建议您在店铺模型中添加is_claimed属性:

class Shop(models.model):

    # you fields are here

    @property
    def is_claimed(self):
        # logik for determining if the shop is claimed
        if claimed:
            return True
        else:
            return False

然后你可以在你的模板中使用:

{% if shop.is_claimed %}
    <p>Taken</p>
{% else %}
    <a href="/claim_shop/{{shop.id}}/">Claim shop now</a>
{% endif %}

您甚至可以将其移动到一个代码段,您可以根据需要添加或(更进一步)为其创建inclusion tag