【问题标题】:Django - Global navigation in base.html using modelDjango - 使用模型在 base.html 中进行全局导航
【发布时间】: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})

【问题讨论】:

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


    【解决方案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 上的评论,这部分得到了理顺。现在一切正常。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-05-16
    • 2020-09-29
    • 2017-10-21
    • 2019-10-24
    • 2013-03-21
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    相关资源
    最近更新 更多