我如何在 Django 基本模板中呈现查询集?

CY2*_*Y23 3 html python django

我有一个基本模板,它几乎可以扩展到我项目中的所有其他模板。我试图用我的数据库中的一些查询集填充我的类别导航栏,但我的方法失败了。由于基本模板没有 url,我发现很难呈现。这是我尝试过的:

这是我的意见功能

def base(request):
    categories = list(Category.objects.all())
    context = {
        'categories': categories
    }
    return render(request, 'ads/base.html', context)
Run Code Online (Sandbox Code Playgroud)

这是我的 html

{% for category in categories %}
    <div class="nav-item dropdown">
        <a href="#" class="nav-link dropdown-toggle" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            { category.name }}&nbsp;
            <span class="float-right text-muted">
                <small>
                    <i class="fas fa-chevron-down"></i>
                </small>
            </span>
        </a>
    </div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

我只想用类别查询集填充我的导航栏

Wil*_*sem 8

即使base视图有一个 URL,也没有任何区别。URL 触发视图,该视图呈现响应。模板与它没有(太多)关系。模板有时用作生成此类响应的一种方式。但它只能使用以某种方式传递的数据进行渲染。例如,通过该视图,或通过模板标签、上下文处理器等。

例如,我们可以定义一个上下文处理器。在您的应用程序中,您可以在context_processors.py文件中定义一个函数:

# app/context_processors.py

def categories(request):
    from app.models import Category
    return {'categories': Category.objects.all()}
Run Code Online (Sandbox Code Playgroud)

settings.py然后,您可以将函数添加到上下文处理器中:

# settings.py

# ...

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'app.context_processors.categories'
            ],
        },
    },
]
Run Code Online (Sandbox Code Playgroud)

现在,每次渲染模板时,都会categories向映射到查询集的上下文添加一个变量Category.objects.all()QuerySets 是惰性计算的,因此如果您不需要对其进行迭代,则不会在数据库上执行查询。

  • 出色的复制,干净而精致 (2认同)