【问题标题】:How to display other entries of my filtered object in Django template如何在 Django 模板中显示我过滤对象的其他条目
【发布时间】: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 }} 之类的操作时,我显然只得到用户正在搜索的一个标签。
我正在努力如何将每辆车的所有标签传递给视图,然后为每辆车显示它们。
有人知道怎么做吗?
感谢您的帮助。

【问题讨论】:

    标签: python django templates object filter


    【解决方案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
    猜你喜欢
    • 2013-09-17
    • 2019-04-05
    • 2019-09-10
    • 1970-01-01
    • 2021-11-17
    • 2017-04-15
    • 2022-10-05
    • 2021-04-29
    • 2013-04-27
    相关资源
    最近更新 更多