模板中的双循环

时间:2019-03-28 16:23:21

标签: python django django-2.1

我的模板和循环实际上有问题。 我在这里描述了相同的问题:Double loop in Django template 我已经尝试了答案,但是没有用:/而且我不了解有关向后关系的django文档

我已经尝试像上面的链接中那样对prefetch_related和selected_related进行搜索,以及其他关于我的问题的搜索,但是我真的不明白它的作用。

型号:

class Categories(models.Model):
    name = models.CharField(max_length=255)
    def __str__(self):
        return self.name

class SousCategories(models.Model): #subcategories
    name = models.CharField(max_length=255)
    categorie = models.ForeignKey(Categories, on_delete=models.CASCADE, null=True)
    def __str__(self):
        return self.categorie.name + " " + self.name

查看:

def index(request):
    response_dict = dict()
    lst_cat = []
    lst_ss_cat = []
    for cat in Categories.objects.all():
        all_cat = dict()
        all_cat['id'] = cat.id
        all_cat['name'] = cat.name
        lst_cat.append(all_cat)
    for ss_cat in SousCategories.objects.all():
        all_ss_cat = dict()
        all_ss_cat['id'] = ss_cat.id
        all_ss_cat['name'] = ss_cat.name
        all_ss_cat['cat'] = ss_cat.categorie
        lst_ss_cat.append(all_ss_cat)
    response_dict['categorie'] = lst_cat
    response_dict['ss_cat'] = lst_ss_cat
    print(response_dict)
    return render(request, "home.html", {'cat': response_dict})

此视图为我提供了此信息(仅用于测试的数据很少):

{'categorie': [{'id': 1, 'name': 'playmobil'}, {'id': 2, 'name': 'deguisements'}], 'ss_cat': [{'id': 1, 'name': 'neuf', 'cat': <Categories: playmobil>}, {'id': 2, 'name': 'occasion', 'cat': <Categories: playmobil>}, {'id': 3, 'name': 'propre', 'cat': <Categories: deguisements>}, {'id': 4, 'name': 'sale', 'cat': <Categories: deguisements>}]}

模板:

<div class="wrapper">
 <nav id="sidebar">
   <div class="sidebar-header">
     <img src="{% static "logo.png" %}" alt="My image">
   </div>
   <ul class="list-unstyled components">
     <p>Categories</p>
     {% for categ in cat.categorie %}
     <li>
       <a href="#{{categ.name}}" data-toggle="collapse" aria-expanded="false" class="dropdown-toggle">{{categ.name|capfirst}}</a>
       <ul class="collapse list-unstyled" id="{{categ.name}}">
         {% for ssc in cat.ss_cat %}
         <li>
           <a href="#">{{ssc.name}}</a>
         </li>
         {% endfor %}
       </ul>
     </li>
     {% endfor %}
   </ul>
 </nav>
 </div>

实际结果是我的balise是空的,而不是包含我的子类别。 然后,如果有人可以向我解释向后关系的工作方式或解决我的问题的方法(我已经找到了此文档,但我迷路了:https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward) PS:我使用的是python和django的最新版本

2 个答案:

答案 0 :(得分:1)

请查看我的评论内联,以解释您的代码正在发生什么:

     {% for cat in cat.categorie %}
         <!-- here cat is redefined as {'id': 1, 'name': 'playmobil'} the first loop -->
     <li>
       ...
       <ul>
         {% for ssc in cat.ss_cat %}
              <!-- cat.ss_cat doesn't exist: no key `ss_cat` (only 'id' or 'name') -->
              ...
         {% endfor %}
       </ul>
     </li>
     {% endfor %}

,但是正如其他注释和答案所解释的那样,即使您对循环变量的命名不同,您仍然每次都会遍历所有与主类别无关的所有子类别,因此它不会做您想要的事情。

答案 1 :(得分:0)

您可以通过category.souscategories_set.all()访问Category实例中的SousCategories,而无需遍历视图中的内容。

相关问题