【问题标题】:How to have template tags recognized in a context variable in DJango如何在 DJango 的上下文变量中识别模板标签
【发布时间】:2015-08-22 18:36:46
【问题描述】:

我有一个 Django 模板,它显示使用模板标签生成的链接,我想将它作为上下文变量发送:

views.py:

def my_view(request):
    ...
    link = '''<a href="{% url 'quests:drop' s.id %}">Drop</a>'''

    context = {
        'link': link,
    }
    return render(request, "my_template.html" , context)

我正在 my_template.html 中尝试这个:

{{ link | safe }}

但链接实际上呈现为“{% url 'quests:drop' s.id %}”

有没有办法让模板引擎识别和执行上下文变量中发送的模板标签?

编辑:

我为什么要这样做是因为我实际上会向模板发送一个按钮列表,每个按钮都有一个不同的链接和文本,它们将被循环通过(在这个例子中,循环通过各种 's' 对象),并且多个视图将使用该模板(每个视图都有自己的按钮集),因此按钮非常特定于上下文。

我的模板正在成为处理所有情况的逻辑意大利面条,并且在上下文中发送按钮似乎会更加干燥,并且会产生更清洁、更易于阅读的模板。

编辑 2:

另一个可以解决问题的选择是如果我可以通过更改部分:

    link_data = ['quests:drop','Drop']
    context = {
        'link_data': link_data,
    }
    return render(request, "my_template.html" , context)

然后模板将具有:

<a href="{% url '{{link_data.0}}' s.id %}">{{link_data.1}}</a>

但是,{{link_data}} 没有呈现,我得到了错误:

Reverse for '{{ link_data.0 }}' ... not found.

【问题讨论】:

    标签: django


    【解决方案1】:

    你不应该是答案。为了实现尝试做的事情,完全符合模板的工作方式,而您将其复杂化了。

    context = {
        'buttons': {
            'button1': {
                'text': 'This is a button',
                'link': reverse('quests:drop', args=[...])
            },
            'button2':{...}
        }
    }
    

    在模板中:

    {% for button in buttons %}
        <a class="btn btn-primary" href={{button.link}}>{{button.text}}</a>
    {% endfor %}
    

    您也可以创建一个Button 类并类似地使用它:

    context = {
        'buttons': [
            Button('This is text', reverse('quests:drop', args=[...]),
            ...
        ],
    }
    

    【讨论】:

    • 使用它,每个对象也需要一个“按钮”列表(在我的示例中,对象是's',如{% for s in submission_list %}。这不是更复杂吗?发送可以在模板中循环的通用链接信息?
    • 所以你有一个submisisons 列表,然后每个提交都有它自己的按钮列表?
    • 是的。不仅如此,多个视图都在使用该模板,每个视图都有自己的提交列表和按钮列表 =)
    • 这听起来像是一个设计问题。你应该让你的视图和模板更通用。
    【解决方案2】:

    参考您的第二次编辑:

    模板中的代码应如下所示:

    <a href="{% url link_data.0 s.id %}">{{ link_data.1 }}</a>
    

    注意省略的'{{ }}' 标签。

    【讨论】:

      猜你喜欢
      • 2014-01-15
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2019-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多