Django:遍历模板中的过滤列表
Django: looping through filtered list in template
我有一个 html 模板,我想在其中循环遍历模型 (SpeciesPage
) 中的对象,这些对象按特定字段值 (subfamily_name="Pierinae"
) 过滤并显示它们在列表中。筛选的结果跨越多个外键关系。最终,我希望模板循环并在单独的列表中显示多个过滤结果,但我无法通过一个过滤列表循环呈现任何内容。我觉得我要完成的事情应该很简单。
models.py(缩写仅显示相关字段)
class Subfamily(models.Model):
subfamily_name = models.CharField(max_length=200)
class Tribe(models.Model):
subfamily = models.ForeignKey(Subfamily, on_delete=models.SET_NULL, null=True)
tribe_name = models.CharField(max_length=200)
class Genus(models.Model):
tribe = models.ForeignKey(Tribe, on_delete=models.SET_NULL, null=True)
genus_name = models.CharField(max_length=200)
class Species(models.Model):
genus = models.ForeignKey(Genus, on_delete=models.SET_NULL, null=True)
species_name = models.CharField(max_length=200)
species_page = models.OneToOneField('SpeciesPage', on_delete=models.SET_NULL, null=True)
class SpeciesPage(models.Model):
title = models.CharField(max_length=100, primary_key=True)
species_name = models.OneToOneField(Species, on_delete=models.SET_NULL, null=True)
views.py
class SpeciesPageListView(generic.ListView):
model = SpeciesPage
template_name = 'speciespage_list.html'
def show(request):
pierinae_pages = SpeciesPage.objects.filter(species_name__genus__tribe__subfamily__subfamily_name="Pierinae")
context = {
'pierinae_pages': pierinae_pages,
}
return render(request, 'speciespage_list.html', context=context)
speciespage_list.html
...
{% for speciespage in pierinae_pages %}
<tr>
<td><i>{{ speciespage.title }}</i></td>
...
</tr>
{% endfor %}
...
我使用了此处的以下答案来尝试解决我的问题:
- Cannot use filter inside Django template html
- Iterate over model instance field names and values in template
如有任何帮助,我们将不胜感激。谢谢!
两件事:
您不想将 OneToOneField
放在 Species
和 SpeciesPage
中并相互指向对方。 (详见https://docs.djangoproject.com/en/2.2/topics/db/examples/one_to_one/)
我认为您可以简化 ListView
以获得所需的输出:
class SpeciesPageListView(generic.ListView):
model = SpeciesPage
template_name = 'speciespage_list.html'
queryset = SpeciesPage.objects.filter(species_name__genus__tribe__subfamily__subfamily_name="Pierinae")
context_object_name = 'pierinae_pages'
然后在 urls.py:
urlpatterns = [
path('', views.SpeciesPageListView.as_view(), name='index'),
]
我有一个 html 模板,我想在其中循环遍历模型 (SpeciesPage
) 中的对象,这些对象按特定字段值 (subfamily_name="Pierinae"
) 过滤并显示它们在列表中。筛选的结果跨越多个外键关系。最终,我希望模板循环并在单独的列表中显示多个过滤结果,但我无法通过一个过滤列表循环呈现任何内容。我觉得我要完成的事情应该很简单。
models.py(缩写仅显示相关字段)
class Subfamily(models.Model):
subfamily_name = models.CharField(max_length=200)
class Tribe(models.Model):
subfamily = models.ForeignKey(Subfamily, on_delete=models.SET_NULL, null=True)
tribe_name = models.CharField(max_length=200)
class Genus(models.Model):
tribe = models.ForeignKey(Tribe, on_delete=models.SET_NULL, null=True)
genus_name = models.CharField(max_length=200)
class Species(models.Model):
genus = models.ForeignKey(Genus, on_delete=models.SET_NULL, null=True)
species_name = models.CharField(max_length=200)
species_page = models.OneToOneField('SpeciesPage', on_delete=models.SET_NULL, null=True)
class SpeciesPage(models.Model):
title = models.CharField(max_length=100, primary_key=True)
species_name = models.OneToOneField(Species, on_delete=models.SET_NULL, null=True)
views.py
class SpeciesPageListView(generic.ListView):
model = SpeciesPage
template_name = 'speciespage_list.html'
def show(request):
pierinae_pages = SpeciesPage.objects.filter(species_name__genus__tribe__subfamily__subfamily_name="Pierinae")
context = {
'pierinae_pages': pierinae_pages,
}
return render(request, 'speciespage_list.html', context=context)
speciespage_list.html
...
{% for speciespage in pierinae_pages %}
<tr>
<td><i>{{ speciespage.title }}</i></td>
...
</tr>
{% endfor %}
...
我使用了此处的以下答案来尝试解决我的问题:
- Cannot use filter inside Django template html
- Iterate over model instance field names and values in template
如有任何帮助,我们将不胜感激。谢谢!
两件事:
您不想将 OneToOneField
放在 Species
和 SpeciesPage
中并相互指向对方。 (详见https://docs.djangoproject.com/en/2.2/topics/db/examples/one_to_one/)
我认为您可以简化 ListView
以获得所需的输出:
class SpeciesPageListView(generic.ListView):
model = SpeciesPage
template_name = 'speciespage_list.html'
queryset = SpeciesPage.objects.filter(species_name__genus__tribe__subfamily__subfamily_name="Pierinae")
context_object_name = 'pierinae_pages'
然后在 urls.py:
urlpatterns = [
path('', views.SpeciesPageListView.as_view(), name='index'),
]