我创建了一个模板标记,并试图遍历模板标记的结果 但我没有得到任何结果
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循环stmt 循环结果不起作用
可能是什么问题?
答案 0 :(得分:3)
要在您的代码中进行此更改,您必须set a variable in the context,但如果您的目标是在模板中提供类别列表,就像您从视图中传递它一样 - 然后你需要编写一个template context processor,这将允许所有视图在其上下文中包含此变量。
模板上下文处理器只是一种通过返回字典来添加到请求上下文的方法。可以把它想象成一个只返回上下文的视图函数。
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
shortcut,这将确保正确传递上下文。
在您的观看中,您现在可以这样做:
from django.shortcuts import render
def home(request):
return render(request, 'home.html')
在您的home.html
中,您现在可以:
{% for name in category_names %}
{{ name }}
{% endfor %}