Django - 使用模型在 base.html 中进行全局导航
Posted
技术标签:
【中文标题】Django - 使用模型在 base.html 中进行全局导航【英文标题】:Django - Global navigation in base.html using model 【发布时间】:2014-04-29 15:31:49 【问题描述】:我有许多扩展 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 对象并将它们放入 <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】:您不能将模板标签放入另一个模板标签中。您的 for 循环是一个模板标签,它期望您的上下文中的元素名称进行迭代。
如果你想在模板标签中处理导航,你应该考虑使用inclusion tags。
包含标签是使用模板呈现其数据的函数。
一个非常基本的实现可能如下所示:
tags.py
@register.inclusion_tag('navigation.html')
def navigation(selected_id=None):
return
'navigation': Division.objects.all(),
'selected':selected_id,
在您的模板标签文件中,您创建一个包含导航项的字典,以及可选的当前选定项以突出显示此导航元素。
导航.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 作为参数添加。
【讨论】:
感谢您将我转向包含标签。我已经很好地包含了navigation.html,但我似乎没有让navigation.html 与我的模型一起使用。% load current_tags % <ul> <li> navigation </li> <li>Nothing shown</li> </ul>
是我的 navigation.html,我什至将 current_tags.py 简化为 from django import template from libs.display.models import Division register = template.Library() @register.inclusion_tag('display/navigation.html') def navigation(self): return 'Hello'
是否缺少一些关键步骤来将标签返回导航??
实际上,我可以将navigation.html 放入base.html 的唯一方法是使用% include 'display/navigation.html' %
.....只是做% navigation %
不起作用。
我会在another question...谢谢。
你用过% navigation %
或 navigation
吗?
我做了% navigation %
但我认为这是指模板,而不是标签。没有意识到标签正在渲染模板;以为模板正在拉入标签。感谢here 上的评论,这部分得到了理顺。现在一切正常。谢谢!以上是关于Django - 使用模型在 base.html 中进行全局导航的主要内容,如果未能解决你的问题,请参考以下文章
Django:在 django admin 中扩展 base.html
我可以在Django的base.html之外使用{%static%}吗?