4

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

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

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

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

4

2 回答 2

14

This is fixed in django 1.5.

In versions prior to 1.5 you need to use

{% extends 'base.html' %}

{% load url from future %}

{% url 'name_as_a_string' %}
{% url name_stored_in_variable %}

From https://docs.djangoproject.com/en/dev/releases/1.5/

One deprecated feature worth noting is the shift to “new-style” url tag. Prior to Django 1.3, syntax like {% url myview %} was interpreted incorrectly (Django considered "myview" to be a literal name of a view, not a template variable named myview). Django 1.3 and above introduced the {% load url from future %} syntax to bring in the corrected behavior where myview was seen as a variable.

于 2012-12-26T19:43:36.100 回答
0

好吧,在这种情况下,您可以使用{% 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 %}

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

于 2012-12-26T19:47:17.340 回答