我有许多扩展 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})
答案 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添加为参数。