2

base.htmlを拡張するテンプレートがいくつかあります。base.htmlテンプレートにグローバル ナビゲーションを格納し、グローバル ナビゲーションのテキストとリンクをモデル Division に基づくようにしたい (つまり、CharFieldモデルの はグローバル ナビゲーションのボタン テキストとして使用され、id はURL の作成に使用されます)。タグが機能する可能性があると思っていましたが、最終的には次のようになりました (はい、Django と Python は初めてです)。

current_tags.py

from django import template
# Import your model
from libs.display.models import Division
from django.db import models

register = template.Library()
@register.simple_tag
def do_get_divisions(self):
    d = Division.objects.all()
    mylist = []
    for each in d:
        mylist.append(str(each.DivisionValue))
    return my list

以下に示すように、テンプレート内のオブジェクトを取得または操作できないため、この時点で各オブジェクトのテキスト値を取得して印刷しようとしています。

base.html

<!DOCTYPE html>
<html>
<head>
    {% load staticfiles %}
    <link rel="stylesheet" type="text/css" href="{{ STATIC_URL }}style.css" />
</head>
<body>
{% load current_tags %}
<p>{% do_get_divisions "" %}</p> **THIS ACTUALLY PRINTS mylist**

{% for each in do_get_divisions %} **THIS DOESN'T PRINT ANYTHING**
    <p>{{ each }}</p>
{% endfor %}  
{% block content %}
{% endblock %}
</body>
</html>

Django のモデルに基づいてグローバル ナビゲーションを行うためのより良い方法があると確信しています。私は基本的に、すべての Division オブジェクトを取得し、 base.html<ul>でグローバル ナビゲーションとして使用するためにそれらを に入れたいと考えています。私は Django にはあまり詳しくありませんが、base.htmlを拡張しているbase.htmlではなく、他のテンプレートをレンダリングしているため、 views.pyは役に立ちません。価値があるのは、/display/info.htmlテンプレートが base.html を拡張する1 つのviews.pyです。

# Create your views here.
from django.http import HttpResponse
from apps.pulldata.models import Data
from django.shortcuts import render, get_object_or_404
from django.http import Http404

def info(request, group_id):
    group = get_object_or_404(Data, pk=group_id)
    s = group.XInGroup.all()
    return render(request, 'display/info.html', {'Group': group, 's': s})
4

1 に答える 1

3

テンプレートタグを別のタグに入れることはできません。forループは、コンテキスト内の要素の名前が反復されることを期待するテンプレートタグです。

テンプレート タグでナビゲーションを処理する場合は、包含タグの使用を検討する必要があります。

包含タグは、テンプレートを使用してデータをレンダリングする関数です。

非常に基本的な実装は次のようになります。

tags.py

@register.inclusion_tag('navigation.html')
def navigation(selected_id=None):
    return {
        'navigation': Division.objects.all(),
        'selected':selected_id,
    }

templatetag ファイルで、ナビゲーション項目とオプションで現在選択されている項目を含む辞書を作成して、このナビゲーション要素を強調表示します。

ナビゲーション.html

<ul>
{% for item in navigation %}
  <li{% if item.id == selected %} class="selected"{% endif %}>
    <a href="{{ item.get_absolute_url }}">{{ item.DivisionValue }}</a>
  </li>
{% endfor %}
</ul>

navigation.html は Python 関数の辞書をコンテキストとして使用するため、ナビゲーションを単純に繰り返すことから始めます。

base.html

{% navigation %}

また

{% navigation current_division.id %}

base.html では、通常のテンプレート タグのように包含タグを呼び出します。現在のアイテムを強調表示する場合は、その ID を引数として追加します。

于 2014-03-22T05:05:23.263 に答える