模板中的双循环
Double loop for in template
实际上我的模板和循环有问题。
我遇到了此处描述的相同问题:
我已经尝试了答案,但它不起作用:/而且我不理解关于向后关系的 django 文档
我已经尝试 prefetch_related 和 selected_related 就像上面的 link 和其他关于我的问题的搜索,但我真的不明白它做了什么。
型号:
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})
This view give me this (Few datas just for test) :
{'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>
实际结果是我的 ul balise 是空的,而不是包含我的子类别。
然后,如果有人可以向我解释反向关系的工作原理或解决我的问题的方法(我找到了这个文档,但我迷路了:https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward)
PS : 我用的是最新版本的 python 和 django
查看我的内联评论,解释您的代码发生了什么:
{% 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 %}
但是正如其他评论和答案所解释的那样,即使您以不同的方式命名循环变量,您每次仍会循环遍历所有子类别,与主类别无关,因此它不会执行您的操作想要.
您可以通过 category.souscategories_set.all()
访问 Category 实例中的 SousCategories,无需遍历视图中的内容。
实际上我的模板和循环有问题。
我遇到了此处描述的相同问题:
我已经尝试 prefetch_related 和 selected_related 就像上面的 link 和其他关于我的问题的搜索,但我真的不明白它做了什么。
型号:
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})
This view give me this (Few datas just for test) :
{'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>
实际结果是我的 ul balise 是空的,而不是包含我的子类别。 然后,如果有人可以向我解释反向关系的工作原理或解决我的问题的方法(我找到了这个文档,但我迷路了:https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward) PS : 我用的是最新版本的 python 和 django
查看我的内联评论,解释您的代码发生了什么:
{% 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 %}
但是正如其他评论和答案所解释的那样,即使您以不同的方式命名循环变量,您每次仍会循环遍历所有子类别,与主类别无关,因此它不会执行您的操作想要.
您可以通过 category.souscategories_set.all()
访问 Category 实例中的 SousCategories,无需遍历视图中的内容。