2

我有一个 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 文档中的过滤器以应用于模板标签或模板中的字符串,以便字符串不会被转义但没有运气。

我看过这个,但似乎应该有一种简单的方法在模板中对 {{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,我在这个问题上花了几个小时。

4

2 回答 2

3

您正在传递值,所以只需将其替换。

return '<a href="/claim_shop/%s/">Claim shop now</a>' % (shop_id,) # or however you refer to it in the code
于 2012-11-29T08:42:55.000 回答
1

我建议您在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 %}

您甚至可以将其移动到一个片段中,您可以根据需要将其包含在内,或者(更进一步)为其创建一个包含标签

于 2012-11-29T08:51:22.670 回答