django - Django如何在模板中做model1.model2_set.all()?
问题描述
我正在建立一个网站,我有两个模型,我们称它们为 Model1 和 Model2,其中 Model2 有一个指向 Model1 的 foreignKey 属性。我有一个模板,我可以在其中访问数据库 Model1 表中所有条目的列表。我想要的是对与特定条目model1关联的所有条目model2进行for循环。在一个视图中,我可以这样做:for model2 in model1.model2_set.all():
但我怎样才能在模板中做到这一点?我试过{% for model2 in model1.model2_set.all %}
了,但这不起作用。
提前致谢 !
编辑:models.py
class Plat(models.Model):
titre = models.CharField(max_length = 100)
description = models.TextField(null = True)
allergenes = models.TextField(null = True)
prix = models.IntegerField(verbose_name = "Prix par portion")
chef = models.ForeignKey('inscription.Chef', on_delete = models.CASCADE)
date_prep = models.DateTimeField(default=timezone.now, verbose_name="Date et heure de préparation")
nb_portions = models.IntegerField(verbose_name = "Nombre de portions disponibles")
photo = models.ImageField(upload_to = "photos_plat/")
is_ordered = models.BooleanField(default=False)
class Meta:
verbose_name = "Plat"
ordering = ['date_prep']
def __str__(self):
return self.titre
class Commande(models.Model):
user = models.ForeignKey(User, on_delete = models.CASCADE)
plat = models.ForeignKey('Plat', on_delete = models.CASCADE) # models.PROTECT pour pas supprimer, models.CASCADE pour supprimer.
nb_portions = models.IntegerField(verbose_name = "Nombre de portions")
date = models.DateTimeField(verbose_name="Date de commande")
livraison = models.BooleanField(default=False)
adresse_livraison = models.CharField(max_length = 100, verbose_name = "Adresse de livraison", blank = True)
class Meta:
verbose_name = "Commande"
ordering = ['date']
Model1 是 Plat,Model2 是 Commande
视图.py
def mes_plats(request):
return render(request, 'actualites/mes_plats.html', {'my_meals': Plat.objects.filter(chef=request.user.useradvanced.chef, date_prep__gte = date.today())})
mes_plats.html
{% for plat in my_meals %}
{% if plat.is_ordered %}
<ul>
{% for commande in plat.commande_set.all %}
<li> {{ commande.user.useradvanced }} : {{ commande.nb_portions}} portions.</li>
</ul>
{% else %}
Ce plat n'a pas encore été commandé par un utilisateur.
{% endif %}
解决方案
首先,您需要model1
通过这样的上下文将您的实例传递给模板:
def your_view(request,pk):
model1_instance = YourModel.objects.get(pk=pk)
return render(request,'your_template',{'model1':model1_instance})
现在在您的模板中,这{% for model2 in model1.model2_set.all %}
应该可以工作。
编辑:如果您已将查询集传递给模板,您可以这样做
{% for obj1 in your_model1_queryset %}
{% for obj2 in obj1.model2_set.all %}
...
{% endfor %}
{% endfor %}
推荐阅读
- keycloak - Keycloak 令牌验证流程
- android - 如何将自己的模板添加到 android studio 中的新项目活动列表向导?当用户进行新项目时显示
- sql - 部分计数聚合
- javascript - IONIC 5.2.2:无法加载资源:net::ERR_CLEARTEXT_NOT_PERMITTED。标准解决方案不起作用
- python - 由于导入 _ssl 错误,无法在 Anaconda3 中启动 jupyter notebook
- android - SQLite 查询仅从某个存储桶中检索图像
- kubernetes - Azure CD 管道将映像推送到 AKS(Kubernetes 管道)
- c# - 具有子/嵌套对象的类的 C# 计数属性
- java - 执行“org.hibernate.internal.SessionFactoryImpl()”构造函数时出现“AbstractMethodError”错误
- python - 处理 JSON 响应、编辑和发送