【问题标题】:objects.all() queryset not working with view to template; many-to-one relationshipobjects.all() 查询集不适用于模板视图;多对一关系
【发布时间】:2015-08-01 00:26:50
【问题描述】:

我试图让这个模板调用一个过去曾以多对多关系工作的函数。这次是多对一。

detail.html 模板

{{ icecreamflavor.name.all }}

观点:

    from django.shortcuts import get_object_or_404, render
    from django.views import generic

    from .models import IceCream, IceCreamFlavor

    # Create your views here.


    class IndexView(generic.ListView):
        template_name = 'ice_cream/index.html'
        context_object_name = 'ice_cream_list'

        def get_queryset(self):
            return IceCream.objects.order_by('brand')

    class DetailView(generic.DetailView):
        model = IceCreamFlavor
        template_name = 'ice_cream/detail.html'

2 个型号:

class IceCream(models.Model):
    ice_cream_id = models.AutoField(primary_key=True)
    brand = models.CharField(max_length=200)

    def __unicode__(self):
        return self.brand


class IceCreamFlavor(models.Model): 
    ice_cream_flavor_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=200)
    rating = models.DecimalField(max_digits=3, decimal_places=1)
    brand = models.ForeignKey(IceCream)    

    def __unicode__(self):
        return self.name

这是一个多对一的关系,我相信在我看来,我在 DetailView 的模型上有些东西搞砸了。我想使用 objects.all() 方法在详细视图中简单地调用冰淇淋的所有口味。

什么都没有出现。教程中的文档让我有点困惑。 IndexView 工作并显示所有品牌;只需要 DetailView 来调出所有的味道;我稍后会格式化。作为记录,detail.html 模板中的{{ icecreamflavor }} 确实只带来了一种风格,而不是全部。我相信这与实例有关..

【问题讨论】:

  • 您有 2 个视图,您使用的是哪一个?索引视图? DetailView 只向模板发送 1 个对象,即您要查看详细信息的对象。并且在模板中你不能对数据库进行查询,你必须从视图中发送 objects.all(),就像在 IndexView 中写着def get_queryset() 的部分
  • 我正在尝试使用 DetailView。

标签: django django-templates django-views


【解决方案1】:

索引视图

首先,当您使用Django Generic List View 时,模板中的对象列表称为object_list。检查上面的链接以查看 django 文档。

所以要在 Index 模板中显示所有 IceCream 名称,您应该这样做:

{% for item in object_list %}
    {{item.brand}}
{% endfor %}

要访问 IceCream 的 IceCreamFlavors,您应该这样做:

{% for item in object_list %}
    {{item.icecreamflavor_set.all}}      
{% endfor %}

{{item.icecreamflavor_set.all}} icereamflavor_set

当外键是从 IceCreamFlavor 到 IceCream,并且您想从 IceCream 访问到 IceCreamFlavor 时,您需要在模型名称中添加 _set

详细视图

第二个视图是 Django Generic DetailView,因此视图只向模板发送一个项目是完全正常的行为。

如果要传递所有需要的项目,请将视图从 DetailView 更改为 ListView。

我建议您查看有关 ListView 和 DetailView 的文档,以更好地了解那里发生的情况。

另外我建议你检查Django: Backward relationships

【讨论】:

  • 我对 item.brand 的索引视图代码基本相同。我需要为详细视图完成此操作。我希望风味显示在详细视图中而不是索引视图中。我希望这很清楚。谢谢。
  • 我知道如何让它显示在索引中,问题是加载新页面时的详细视图。
  • 好的。听起来这种“反向关系”是理解对象检索的关键。无论如何,我让它在 DetailView 中工作。我在DetailView的视图中将模型更改为IceCream而不是IceCreamFlavor,然后在detail.html的模板中我只是将其更改为{{ icecream.icecreamflavor_set.all }}
  • 关键是它接缝的关系不同。在我的另一个应用程序中,我在相同的模板和详细视图中有这样的代码:{{ game.company.all }},它的工作原理就像它显示所有公司一样。但是,当我将其更改为 {{ game.company_set.all }} 时,没有任何显示。
  • 所以{{ game.company.all }} 与(几乎相同的视图和模板)和{{ icecream.icecreamflavor_set.all }} 在一个应用程序中工作的原因之间存在很大差异。一种是使用all()方法,另一种是使用set.all()
猜你喜欢
  • 1970-01-01
  • 2015-12-06
  • 2019-09-20
  • 2022-12-31
  • 1970-01-01
  • 2018-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多