如何在 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]
,然后查看car
和car.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 模板中显示我过滤对象的其他条目的主要内容,如果未能解决你的问题,请参考以下文章