【问题标题】:How to pass a variable to {% url %} tag in django?如何将变量传递给 django 中的 {% url %} 标签?
【发布时间】:2012-12-12 06:50:35
【问题描述】:

我有 2 个视图:a 和 b,它们都渲染到一个模板 T。 还有 a_2 和 b_2 视图。并且 T 模板应该生成 a_2 和 b_2 视图的 url。

但是我不能使用 {% url %} 因为我不能将 url 名称作为参数传递。

我无法在视图中生成整个 url,因为我应该多次执行(在表格中的一行上 - 所以它可能是数百个链接)

我不想写2个完全相同的模板。所以问题是 - 如何避免这种情况?

【问题讨论】:

    标签: python django templates url


    【解决方案1】:

    这已在 django 1.5 中修复。

    在 1.5 之前的版本中,您需要使用

    {% extends 'base.html' %}
    
    {% load url from future %}
    
    {% url 'name_as_a_string' %}
    {% url name_stored_in_variable %}
    

    来自https://docs.djangoproject.com/en/dev/releases/1.5/

    一个值得注意的弃用功能是转向“新式”网址 标签。在 Django 1.3 之前,解释像 {% url myview %} 这样的语法 错误地(Django 认为“myview”是 视图,而不是名为 myview 的模板变量)。 Django 1.3 及更高版本 引入了 {% load url from future %} 语法来引入 更正了 myview 被视为变量的行为。

    【讨论】:

    • 我会试一试的。会很棒!
    • @KorniltsevAnatoly 您不需要更新 Django。只需在模板中使用 `{% load url from future %} 即可。但请注意,这需要将任何不引用字符串的 URL 更改为使用引号。
    • 感谢您的注意,但我已更新到 beta 2。它不是生产应用程序,所以没关系。
    【解决方案2】:

    好吧,在这种情况下,您可以使用{% if %} 标记并向其添加一些条件(可能还可以在上下文中添加一些变量)或编写自定义 url 标记。

    myapp
        templatetags
            __init__.py
            myapp_urls.py
    

    myapp_urls.py

    from django import template
    from django.template import Context
    from django.template.defaulttags import register
    
    @register.tag(name="custom_url")
    def render_map(parser, token):
        contents, url_name = token.split_contents()
        return CustomURLNode(url_name)
    
    class CustomURLNode(template.Node):
        def __init__(self, url_name):
            self.url_name = template.Variable(url_name)
    
        def render(self, context):
            return reverse(url_name.resolve(context))
    

    在模板中:

    {% load myapp_urls %}
    
    {% custom_url myvar %}
    

    这是未经测试的代码,可能包含错误,但编写 custom template tags 应该是一个很好的解决方案。

    【讨论】:

      猜你喜欢
      • 2018-04-12
      • 2011-03-04
      • 2021-10-12
      • 1970-01-01
      • 2020-04-24
      • 2018-05-08
      • 1970-01-01
      • 2015-06-22
      • 2018-08-03
      相关资源
      最近更新 更多