【问题标题】:Django - Is there a way to create a variable in the template?Django - 有没有办法在模板中创建一个变量?
【发布时间】:2010-06-04 16:58:19
【问题描述】:

我想这样做:

{% for egg in eggs %}
    <p>{{ egg.spam }}</p>
    {% if egg.is_cool %}
        {% myvariable = egg %} // Possible in any way?
    {% endif %}
{% endfor %}

请原谅 JavaScript 风格的评论(它显示为对 SO 的评论)

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    我认为最接近的是with 标签:http://docs.djangoproject.com/en/dev/ref/templates/builtins/#with

    如果您说尝试在模板中突出显示某个项目,我可以想象这样做:

    <div class="special">
    {% with some_list.first as special_item %}
        {{ specialitem }}
    {% endwith %}
    </div>
    
    <div class="everything">
    {% for item in some_list %}
        {{ item }}
    {% endfor %}
    </div>
    

    如果你想要一些特殊的逻辑来确定哪个是特殊项目,我会向对象添加一个方法(所以你最终得到:{% with some_collection.my_method as special_item %} 以上)或者在将特殊项目传递给视图之前确定它.希望对您有所帮助。

    【讨论】:

    • 基本上,创建变量的原因是在循环之外使用它。 with 标签本身就是一个循环。我需要稍后在页面中访问myvariable
    【解决方案2】:

    欢迎使用 Django 模板。

    这个问题很容易通过发布到 DjangoSnippets.com 的最早的 sn-ps 之一解决:Expr tag

    人们可以整天争论逻辑与模板的分离,但这忽略了模型或视图中的 业务逻辑,以及 表示逻辑 仅属于模板中的。如果您有很多表示逻辑,您可能需要考虑为部分或全部模板使用Jinja2。警告:虽然 Jinja2 看起来很像 Django 的模板语言,但与 Custom Template Tags 之类的东西不兼容。

    【讨论】:

    • 谢谢彼得。我一直在考虑使用 Cheetah,但从未真正考虑过使用 Jinja。我认为原因是我目前使用 Velocity,但现在我习惯使用 Django 模板的样式和语法,Jinja 可能是一个很好的补充。
    【解决方案3】:

    是的,您可以使用with 构造:

    {% with myvariable as egg %}
    do stuf
    {% endwith %}
    

    【讨论】:

    • 唯一的问题是:The populated variable (in the example above, total) is only available between the {% with %} and {% endwith %} tags.
    【解决方案4】:

    我认为最好在视图中执行这种测试和设置行为,而不是在模板中。如果有的话,它可以让您在需要时更好地控制缓存。

    【讨论】:

    • 这样做的问题是我需要在所有视图中都这样做。
    • 如果您真的需要在所有视图中执行此操作,您可以创建一个装饰器或一些中间件来封装您需要的任何逻辑。
    猜你喜欢
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2022-06-17
    • 1970-01-01
    • 2021-05-12
    • 2016-08-26
    • 2017-02-12
    • 2015-07-19
    相关资源
    最近更新 更多