从模板中的queryset获取对象名称

时间:2019-03-01 08:53:35

标签: django jinja2

如何在模板中通过id手动从queryset获取对象?

context_prosessors.py

from products.models import Category


def cat_sidebar(request):
    sidebar_category = Category.objects.all()
    return {'cat_sidebar': sidebar_category}

模板

<h2 class="card-title text-white title">
    {{cat_sidebar.sub_category.get(id = 5).name}}
</h2>

2 个答案:

答案 0 :(得分:0)

这是我的解决方案(基于自定义标签):

您正在寻找的是模板标签。进入产品应用目录,添加以下文件:

templatetags
templatetags/__init__.py
templatetags/tags.py

templatetags / tags.py 文件:

from django import template

register = template.Library()

@register.simple_tag
def get_name(cat_sidebar, id):
    return cat_sidebar.get(id=id).name

模板部分,带有我们的标记调用:

{% load tags %}

<h2 class="card-title text-white title">
    {{get_name cat_sidebar 5}}
</h2>

有关更多信息,请参见https://docs.djangoproject.com/en/2.1/howto/custom-template-tags/

答案 1 :(得分:0)

您不能将参数传递给模板中的函数。这是不允许的。

cat_sidebar.sub_category.get(id = 5).name

有一个解决方法,其中的模板标记可以在here中阅读,但我建议您在视图中执行此操作,然后使用上下文将其发送到模板因为在视图中执行操作比在模板中执行操作更快。

模板标记解决方案

注意-只有在必须这样做且我不建议这样做的情况下。

在您的项目中添加 templatetags 及其内容。

yourapp/
    __init__.py
    models.py
    templatetags/
        __init__.py
        mytags.py
    views.py

__ init __。py 可以为空。您的 mytags.py 文件将具有以下内容

from django import template
from ..models import Category  # Import Category here. Yours might differ

register = template.Library()


@register.simple_tag
def get_category_by_id(id):
    category = Category.objects.get(id=id)
    return category

现在模板看起来像这样

{% load mytags %}
{% get_category_by_id 5 %}

建议的解决方案:

视图将如下所示。

def cat_sidebar(request):
    sidebar_category = Category.objects.all()
    category = Category.objects.get(id = 5)

    return {'cat_sidebar': sidebar_category, 'category': category}

模板变成

<h2 class="card-title text-white title">
    {{ category.name }}
</h2>