【问题标题】:Categorise using foreign key in django在 django 中使用外键进行分类
【发布时间】:2021-05-02 17:24:19
【问题描述】:

我想一次显示具有特定外键的产品名称

我的模型.py:

from django.db import models


class Company(models.Model):
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name


class Product(models.Model):
    company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name='comapny')
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.name

我希望它将公司名称显示为列表标题,后跟该特定公司的所有产品列表,但不知道如何过滤它并显示在 html 上

我的意见.py:

class Hydraulic(ListView):
    template_name = 'hydraulics.HTML'
    context_object_name = 'hydraulic'
    model = models.Product

谁能告诉我如何过滤外键名称并将其注入 HTML

谢谢

【问题讨论】:

    标签: django django-models django-views django-templates


    【解决方案1】:

    在您的模型中,我认为您在 related_name=comapny 中打错字了(更改为公司)。

    首先,将查询集添加到您的视图中并按公司订购。使用 select_related 将防止访问每个公司名称的数据库,因为它已经从初始查询中获取。

    class Hydraulic(ListView):
        template_name = 'hydraulics.HTML'
        context_object_name = 'hydraulic'
        queryset = models.Product.objects.select_related('company').order_by('company')
    

    然后,在您的模板中,您可以像这样进行迭代:

    {% for item in hydraulic %}
     {% ifchanged item.company %}
          <h1> {{ item.company }} </h1>
     {% endifchanged %}
          <div> {{ item }} </div>
    {% endfor %}
    

    使用ifchanged 标签将只显示一次公司名称,然后是其所有产品。

    【讨论】:

    • 您好,感谢您的回答,但是如果我不想在所有页面上显示某些公司及其产品该怎么办
    • 我不确定您的意思,但您可以使用your_queryset.exclude(company='id_company') 在查询中排除某些公司,或者在模板中使用简单的 if 条件跳过。
    • 好的,谢谢,即使产品没有按照公司名称排序,这也能正常工作吗?
    • 是的。唯一的问题是ifchanged 查看以前的记录,因此有时如果查询集中的两个以下产品没有同一家公司,它可能会再次打印该公司。但也许这也是您想要实现的目标。
    • 那么您需要按照我在回答中提到的那样按公司订购(使用order_by)。您不能遍历无序查询集并期望它在您的模板中被排序(如公司“打包”)。
    猜你喜欢
    • 2021-12-20
    • 2012-04-11
    • 2012-04-28
    • 2019-03-15
    • 2013-10-25
    • 2013-07-24
    • 2018-03-23
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多