在django中使用外键进行分类
我想一次显示具有特定外键的产品名称 my models.py:在django中使用外键进行分类,django,django-models,django-views,django-templates,Django,Django Models,Django Views,Django Templates,我想一次显示具有特定外键的产品名称 my models.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(Co
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上
my views.py:
class Hydraulic(ListView):
template_name = 'hydraulics.HTML'
context_object_name = 'hydraulic'
model = models.Product
有人能告诉我如何过滤foreignkey的名称并将其注入HTML吗
谢谢你在你的模型中,我想你在相关的公司里输入了一个错误
首先,将查询集添加到视图中,并按公司排序。使用select\u related
将防止访问每个公司名称的数据库,因为它已经从初始查询中获取
液压类(列表视图):
模板名称='hydraulics.HTML'
上下文\对象\名称='液压'
queryset=models.Product.objects。选择相关(“公司”)。订购人(“公司”)
然后,在模板中,您可以像这样迭代:
{% for item in hydraulic %}
{% ifchanged item.company %}
<h1> {{ item.company }} </h1>
{% endifchanged %}
<div> {{ item }} </div>
{% endfor %}
{%中的项目为%}
{%ifchanged item.company%}
{{item.company}
{%endifchanged%}
{{item}}
{%endfor%}
使用
ifchanged
标记将只显示一次公司名称,然后是它的所有产品。嘿,谢谢你的回答,但是如果有某些公司及其产品我不想显示在所有页面上,该怎么办?我不知道你的意思是什么,但是你可以使用你的\u queryset.exclude(company='id\u company')排除查询中的一些公司
或者在模板中,您可以跳过一个简单的if条件。好的,谢谢,即使产品没有按照公司名称排序,这也会起作用,对吗?是的。唯一的问题是,ifchanged
会查看以前的记录,因此有时如果查询集中的两个以下产品没有相同的公司,它可能会再次打印该公司。但也许这也是你想要实现的目标。然后,你需要按照我在回答中提到的公司进行订购(使用order\u by
)。您不能迭代一个无序的查询集,并期望它在您的模板中被订购(如“打包”的公司)。