4

2つのビューがあります。aとbはすべて1つのテンプレートTにレンダリングされます。a_2とb_2のビューもあります。また、Tテンプレートはa_2およびb_2ビューへのURLを生成する必要があります。

ただし、URL名をパラメーターとして渡すことができないため、{%url%}を使用できません。

ビューでURL全体を生成することはできません。これは、複数回実行する必要があるためです(1つはテーブルの1行にあるため、数百のリンクになる可能性があります)

まったく同じテンプレートを2つ書きたくありません。だから問題は-これを回避する方法は?

4

2 に答える 2

14

これはdjango1.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/から

注目に値する非推奨の機能の1つは、「新しいスタイル」のURLタグへの移行です。Django 1.3より前は、{%url myview%}のような構文が正しく解釈されていませんでした(Djangoは「myview」をmyviewという名前のテンプレート変数ではなく、ビューのリテラル名と見なしていました)。Django 1.3以降では、{%load url from future%}構文が導入され、myviewが変数として表示される修正された動作が導入されました。

于 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 に答える