Django - 使用模型在base.html中进行全局导航

时间:2014-03-22 02:38:47

标签: django django-models django-templates django-views django-tagging

我有许多扩展 base.html 的模板。我希望 base.html 模板能够容纳我的全局导航,并让全局导航中的文本和链接基于模型部门(即​​模型中的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对象并将它们放入<ul>以用作 base.html 中的全局导航。我对Django并不熟悉,但我的 views.py 对我没有帮助,因为我正在渲染其他模板,而不是 base.html ,它们正在扩展 base.html文件。对于它的价值,这里有一个 views.py ,其中 /display/info.html 模板扩展 base.html

# 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})

1 个答案:

答案 0 :(得分:2)

您无法将模板标签放入另一个模板标签中。你的for循环是一个模板标签,它要求你的上下文中元素的名称迭代。

如果您想在模板标记中处理导航,则应考虑使用inclusion tags

包含标签是使用模板呈现其数据的功能。

一个非常基本的实现可能看起来像这样:

tags.py

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

在模板标签文件中,您可以使用导航项和可选的当前选定项创建一个字典,以突出显示此导航元素。

navigation.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添加为参数。