如何在 Django 模板中显示我过滤对象的其他条目

Posted

技术标签:

【中文标题】如何在 Django 模板中显示我过滤对象的其他条目【英文标题】:How to display other entries of my filtered object in Django template 【发布时间】:2013-08-30 02:32:41 【问题描述】:

在我的 Django-Project 中,我有一个模型,看起来像这样:

class Tag_car(models.Model):
    car = models.ForeignKey(Car)
    tag = models.ForeignKey(Tag)

car是ImageField的外键,tag是TextField的外键。

每辆车都有不止一个标签。 现在用户应该能够通过标签搜索特定的汽车。在我看来,我就是这样做的:

…
search = request.POST.get('search')
cars = Tag_car.objects.filter(tag=search)
…
return render_to_response(page,context_instance=RequestContext(request, 'cars': cars))

在我的模板中,我会像这样显示所有汽车:

% for car in cars %
    <img src=" MEDIA_URL  car.car ">
% endfor %

一切正常。 但现在我还想在模板的 for 循环中显示与每辆车相关的所有标签。当我执行 car.tag 之类的操作时,我显然只得到用户正在搜索的一个标签。 我正在努力如何将每辆车的所有标签传递给视图,然后为每辆车显示它们。 有人知道怎么做吗? 感谢您的帮助。

【问题讨论】:

【参考方案1】:

因此,问题在于您作为cars 传递给模板的对象实际上是Tag_car 对象的列表。所以,为了得到与每辆车相关的其他标签列表,您需要按照与汽车的关系,然后查询其他标签:

% for car in cars %
    ...
    % for tag in car.car.tag_set.all %
        ...
    % endif %
% endif %

请注意,您可能应该首先查询 Car 对象,而不是 Tag_cars。另外,您的 Tag_car 模型实际上只是多对多关系的直通表,因此您可以在 Car 模型上使用 M2M 字段,而不是显式创建它:

tags = models.ManyToManyField(Tag)

【讨论】:

另外,通过使用car.car.tag_set.all,不会输入 for 循环。我担心更改模型,因为该应用程序已经在服务器上进行生产使用。 你真的需要通过 shell 自己调查一下。使用car = Tag_car.objects.filter(tag='mytag')[0],然后查看carcar.car的属性。 谢谢。在我的Car-Model 中,我必须添加tags = models.ManyToManyField(Tag, through='Tag_car')。然后我可以在 for 循环中使用car.car.tags.all 访问标签。【参考方案2】:

在模板中迭代car.tag.all

% for car in cars %
    <img src=" MEDIA_URL  car.car ">

    <ul>
    % for tag in car.tag.all %
        <li> tag </li>
    % endfor %
    </ul>
% endfor %

另见:Traversing foreign key related tables in django templates

【讨论】:

刚试过。不幸的是,根本没有进入第二个 for 循环。可能是因为我只通过Tag_car.objects.filter(tag=search) 而不是Tag_car.objects.all() !? @user2721277 你能尝试通过Tag_car.objects.all()吗,只是为了测试目的? @user2721277 也请尝试car.tag_set.all 而不是car.tag.all 当我通过Tag_car.objects.all() 时,for-loop 也没有被输入,也没有使用car.tag_set.all

以上是关于如何在 Django 模板中显示我过滤对象的其他条目的主要内容,如果未能解决你的问题,请参考以下文章

如何过滤django模板中的特殊字符

如果对象存在,Django过滤并显示在模板中

如何在默认过滤器中使用 django 变量作为文本

Django:遍历模板中的过滤列表

如何根据 django 模板中的日期过滤列表

django模板:过滤后的点