如何传递给在Django {%URL%}标签的变量?(How to pass a variable

2019-08-04 18:00发布

我有2次:a和b都呈现一个模板T.还有A_2和B_2意见。 和T模板应生成URL到A_2和B_2意见。

但我不能使用{%URL%},因为我无法通过URL名称为parametr。

我不能生成视图对整个URL,因为我应该多次做(一个对行的表 - 所以它可能是链接hundreeds)

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

Answer 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/

一个弃用的功能值得一提的是转向“新式” URL标记。 到Django的1.3之前,类似语法{%URL MyView的%}被错误解释(Django的认为是“MyView的”是一个观点的文字名称,而不是一个模板变量命名为MyView的)。 Django的1.3和以上介绍的语法{从未来%%负载URL}在校正的行为,其中MyView的被看作是一个变量带来。



Answer 2:

那么,在这种情况下,您可以使用{% if %}标签,并添加一些条件,它(也许有些varianbles上下文)或编写自定义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 %}

这是未经测试的代码,并可能包含错误,但编写自定义的模板标签应该是一个很好的解决方案。



文章来源: How to pass a variable to {% url %} tag in django?