如何将变量传递给django中的{%url%}标记?

时间:2012-12-26 19:25:06

标签: python django templates url

我有2个视图:a和b它们都渲染到一个模板T. 还有a_2和b_2视图。 T模板应该为a_2和b_2视图生成网址。

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

我无法在视图中生成整个网址,因为我应该多次执行(表格中连续一个 - 所以它可能是链接的内容)

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

2 个答案:

答案 0 :(得分:13)

这在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视为变量的行为。

答案 1 :(得分:0)

那么,在这种情况下,您可以使用{% if %}标记并为其添加一些条件(也可能是上下文中的一些变量)或编写自定义网址标记。

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应该是一个很好的解决方案。

相关问题