簡體   English   中英

如何將變量傳遞給django中的{%url%}標記?

[英]How to pass a variable to {% url %} tag in django?

我有2個視圖:a和b它們都渲染到一個模板T.還有a_2和b_2個視圖。 並且T模板應該為a_2和b_2視圖生成網址。

但是我不能使用{%url%}因為我不能將url名稱作為參數傳遞。

我無法在視圖中生成整個URL,因為我應該多次執行它(一個在表中的一行 - 所以它可能是鏈接的hundreeds)

我不想寫2個完全相同的模板。 所以問題是 - 如何避免這種情況?

這在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及更高版本引入了{%load url from future%}語法,以引入糾正后的行為,其中myview被視為變量。

好吧,在這種情況下,您可以使用{% 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 %}

這是未經測試的代碼,可能包含錯誤,但編寫自定義模板標記應該是一個很好的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM