我有 2 个视图:a 和 b 它们都渲染到一个模板 T。还有 a_2 和 b_2 视图。T 模板应该生成 a_2 和 b_2 视图的 url。
但是我不能使用 {% url %} 因为我不能将 url 名称作为参数传递。
我无法在视图中生成整个 url,因为我应该多次执行(一个在表中的一行 - 所以它可能是数百个链接)
我不想写2个完全相同的模板。所以问题是 - 如何避免这种情况?
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.
好吧,在这种情况下,您可以使用{% 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 %}
这是未经测试的代码,可能包含错误,但编写自定义模板标签应该是一个很好的解决方案。