Django 模板标签 forloop
我创建了一个模板标签,想要循环显示这个标签的结果,但我没有得到任何结果。
tags.py
from django import template
from loadprograms import dbcontext
register = template.Library()
@register.simple_tag
def get_category():
x = dbcontext.DBContext()
results = x.executequery("Select name from Categories")
categories = [each[0] for each in results]
return categories
模板代码
{% load category_tags %}
{% get_category %}
{% for each in get_category %}
{{ each }}
{% endfor %}
{% get_category %} 这个命令可以正常显示所有的分类,但用来循环这些结果的 for 循环却不工作。
这可能是什么问题呢?
1 个回答
3
要在你的标签中做这个更改,你需要在上下文中设置一个变量。不过,如果你的目标是让模板中有一个类别列表,就像你从视图中传递过来的那样,那么你需要写一个模板上下文处理器,这样所有的视图都能在它们的上下文中使用这个变量。
模板上下文处理器其实就是一个方法,它通过返回一个字典来添加到请求的上下文中。可以把它想象成一个视图函数,只是返回一个上下文而已。
from .models import Categories
def cat_names(request):
return {'category_names': Category.objects.values_list('name', flat=True)}
要激活这个上下文处理器,你需要做几件事:
把上面的代码添加到一个名为
template_processors.py
的文件中,放在和你的models.py
和views.py
同一个地方。在你的
settings.py
文件中,把这个方法的完整名称添加到TEMPLATE_CONTEXT_PROCESSORS
设置中,确保不要覆盖默认设置。为了方便,可以先导入默认设置,然后再添加:from django.conf.default_settings import TEMPLATE_CONTEXT_PROCESSORS as TCP TEMPLATE_CONTEXT_PROCESSORS = TCP + ('yourapp.template_processors.cat_names',)
使用
render
快捷方式,这样可以确保上下文正确传递。
在你的视图中,现在你可以这样做:
from django.shortcuts import render
def home(request):
return render(request, 'home.html')
在你的home.html
中,现在你可以这样做:
{% for name in category_names %}
{{ name }}
{% endfor %}