1

課題タグを書いて追記したいapp/templatetags/app_extras.py

@register.assignment_tag
def get_obj (objid) :
    return get_object_or_404(MyModel, id=objid)

そしてテンプレで

{% extends "index.html" %}

{% load app_extras %}
{% get_obj 1 as obj %}

{% block title %}{{ obj.name }}{% endblock %}
{% block content %}{{ obj.description }}{% endblock %}

変数objはブロックに表示されません。

私が書くなら

...
{% load app_extras %}

{% block title %}{% get_obj 1 as obj %}{{ obj.name }}{% endblock %}
...

obj はブロックで定義されていますが、「コンテンツ」ブロックでは定義されていません。

ブロックで変数を使用できるようにする方法は?

4

1 に答える 1

5

ここには 2 つの問題があります。まず - 第 2 レベルのテンプレート (基本テンプレートを「拡張」する) を使用している場合、外側のコンテンツ{% block %}は処理されません。これが、ブロックに割り当てられた値がない理由です。実際に割り当てられたことはありません。

2 つ目の問題は、ブロック内のコンテキストが特定のものであり、ブロック内でのみアクセス可能であり、ブロック間ではアクセスできないことです。複数のブロックで利用できるようにするには、共有する必要があります。contextで使用する方法は次のassignment_tagとおりです。

@register.assignment_tag(takes_context=True)
def get_obj (context, objid) :
    context.obj = get_object_or_404(MyModel, id=objid)
    return context.obj

このタグを使用すると、最初のブロックで変数を割り当てることができます。

{% block title %}{% get_obj 1 as obj %}{{ obj.name }}{% endblock %}

次に、次のブロックでコンテキストから使用します。

{% block content %}{{ obj.name }}{% endblock %}

IMHO、これは機能しますが、最善の方法ではありません。ここでの問題は、テンプレートがコンテキストを変更/上書きし、場合によっては望ましくない動作につながる可能性があることです。

于 2012-08-01T12:40:59.103 に答える