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

2024-04-14

我有很多模板可以扩展基本.html。我想要基本.html模板来容纳我的全局导航,并使全局导航中的文本和链接基于模型部门(即CharField模型中的 id 将用作全局导航中的按钮文本,并且 id 将用于构建 URL)。我认为标签可能有用,但我最终得到的是这样的(是的,我是 Django 和 Python 的新手):

当前_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

此时,我正在尝试获取要打印的每个对象中的文本值,因为我无法获取或使用模板中的对象,如下所示。

基本.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>用作我的全球导航基本.html。我对 Django 不太熟悉,但是我的views.py不要帮助我,因为我正在渲染其他模板,而不是基本.html,正在延伸基本.html。对于它的价值,这是一个views.py, where /显示/info.html模板扩展基本.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})

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

如果您想在模板标签中处理导航,您应该考虑使用包含标签 https://docs.djangoproject.com/en/1.6/howto/custom-template-tags/#inclusion-tags.

包含标签是使用模板来呈现数据的函数。

一个非常基本的实现可能如下所示:

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 函数中的字典作为上下文,因此您可以从简单地迭代导航开始。

基本.html

{% navigation %}

or

{% navigation current_division.id %}

在 base.html 中,您可以像普通模板标签一样调用包含标签。如果你想突出显示当前项目,你可以添加它的 id 作为参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django - 使用模型在 base.html 中进行全局导航 的相关文章

随机推荐