python - 无法让 ForeignKeys 中的相关字段显示在模板中
问题描述
我在 Django 2.2 中工作,试图为数据库构建一个视图,该视图将特定公司的所有内容(他们所有商店的位置和公司的注释)编译到一个视图中。我已经尝试了几种不同答案的方法,但似乎仍然无法从相关外键中获取数据以显示在模板中。
模型.py
class Company(models.Model):
name = models.CharField(max_length=30, primary_key=True)
official_name = models.CharField(max_length=50)
corporate_address1 = models.CharField(max_length=50)
corporate_address2 = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.ForeignKey('Country', on_delete=models.CASCADE)
slug = models.SlugField(max_length=30, unique=True)
def __str__(self):
return self.name
class Stores(models.Model):
store_name = models.CharField(max_length=30, primary_key=True)
owner = models.ForeignKey('Company', on_delete=models.CASCADE)
store_address1 = models.CharField(max_length=50)
store_address2 = models.CharField(max_length=50)
city = models.CharField(max_length=60)
state_province = models.CharField(max_length=30)
country = models.ForeignKey('Country', on_delete=models.CASCADE)
type = models.CharField(max_length=30,choices=store_types)
slug = models.SlugField(max_length=30, unique=True)
def get_absolute_url(self):
return reverse("store-detail", kwargs={"slug": self.slug})
class notes(models.Model):
title = models.CharField(max_length=120)
content = models.TextField()
posted = models.DateTimeField(db_index=True, auto_now_add=True)
category = models.ForeignKey('Company', on_delete=models.CASCADE)
active = models.BooleanField(default=True)
def get_absolute_url(self):
return reverse("article-detail", kwargs={"id": self.id})
class Country(models.Model):
country = models.CharField(max_length=30,choices=countries,primary_key=True)
class Meta:
ordering = ["-country"]
db_table = 'country'
def __str__(self):
return self.country
视图.py
class CompanyOverView(LoginRequiredMixin, DetailView):
model = Company
template_name = "company-overview.html"
slug_url_kwarg = 'slug'
query_pk_and_slug = True
pk_url_kwarg = "company.name"
模板
<div align="center">
<p>{{ object.name }}<br>({{ object.official_name }})</p>
<p>{{ object.corporate_address1 }}<br>{{ object.corporate_address2 }}<br>
{{ object.city }}<br>{{ object.state_province }}<br>
{{ object.country }}</p>
</div>
<p>List of Stores</p>
<p>
{% for instance in object_list %}
{{ instance.company.stores.store_name }}
{{ instance.company.stores.store_address1 }}
{{ instance.company.stores.store_address2 }}
{{ instance.company.stores.city }}
{{ instance.company.stores.state_province }}
{{ instance.company.stores.country }}
{% endfor %}
</p>
<p>Notes</p>
<p>
{% for instance in object_list %}
{{ instance.company.notes.title }}
{{ instance.company.notes.posted }}
{% endfor %}
</p>
使用上面的代码,当您输入公司名称时,唯一出现的就是顶部的所有内容(例如,“object.name”在页面上显示为“Acme Corporation”)。for 循环中的任何内容都不会出现在网页上。
查看文档,除非指定,否则 object_list 是 context 的默认名称。我尝试了不同的组合,例如“for store_name in company.store_set.all”和我在其他帖子中找到的其他组合,但没有一个有效。我已经梳理了与外键相关的所有文档,但找不到有效的解决方案。
如果您能提供帮助,请提前致谢。
解决方案
No.object_list
是 ListView 中的默认上下文名称。但是您有一个 DetailView,并且您已经知道它们的默认上下文名称是什么,因为您已经在使用它:object
. 您只需要从那里迭代反向关系:
{% for store in object.stores_set.all %}
{{ store.store_name }}
{{ store.store_address1 }}
...
{% endfor %}
推荐阅读
- ionic-framework - 当您在根 Cordova/App 中时,Ionic 4 后退按钮重新启动应用程序 (DOM) 中的错误
- neo4j - 如何匹配被约束忽略的csv行并仅创建关系
- javascript - 在 React.js 中更新我导入的变量的值
- javascript - 在浏览器关闭时保持用户登录,而不是在刷新时
- c# - 将 asp.net 核心(使用 NAudio)部署到 Kubernetes 时出现 System.DllNotFoundException
- c - 使用 munmap 时回收更高的页面
- java - 无法解析以下工件:javax.sql:jdbc-stdext:jar:2.0、javax.transaction:jta:jar:1.0.1B:
- mysql - 表达式中的 1287 个用户变量已弃用 - 查询重写
- javascript - 从单独的文件触发 JS 自定义事件
- haskell - 约束分布类型族的转换