我有2个视图:a和b它们都渲染到一个模板T. 还有a_2和b_2视图。 T模板应该为a_2和b_2视图生成网址。
但是我无法使用{%url%},因为我无法将url名称作为参数传递。
我无法在视图中生成整个网址,因为我应该多次执行(表格中连续一个 - 所以它可能是链接的内容)
我不想写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应该是一个很好的解决方案。