首页 > 解决方案 > 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 %}

标签: djangodjango-modelsdjango-templates

解决方案


首先,您需要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 %}

推荐阅读