Django 模板标签 forloop

3 投票
1 回答
1855 浏览
提问于 2025-04-18 10:42

我创建了一个模板标签,想要循环显示这个标签的结果,但我没有得到任何结果。

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)}

要激活这个上下文处理器,你需要做几件事:

  1. 把上面的代码添加到一个名为template_processors.py的文件中,放在和你的models.pyviews.py同一个地方。

  2. 在你的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',)
    
  3. 使用render快捷方式,这样可以确保上下文正确传递。

在你的视图中,现在你可以这样做:

from django.shortcuts import render

def home(request):
   return render(request, 'home.html')

在你的home.html中,现在你可以这样做:

{% for name in category_names %}
   {{ name }}
{% endfor %}

撰写回答