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 对象并将它们放入 &lt;ul&gt; 中,以用作我在 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 % &lt;ul&gt; &lt;li&gt; navigation &lt;/li&gt; &lt;li&gt;Nothing shown&lt;/li&gt; &lt;/ul&gt; 是我的 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:在 django admin 中扩展 base.html

我可以在Django的base.html之外使用{%static%}吗?

Django 全球 base.html 模板

如何在 Django 中扩展为“base.html”模板样式

Django - 如何在 base.html 中传递上下文?