Django:遍历模板中的过滤列表

Posted

技术标签:

【中文标题】Django:遍历模板中的过滤列表【英文标题】:Django: looping through filtered list in template 【发布时间】:2020-04-04 05:53:32 【问题描述】:

我有一个 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

任何帮助将不胜感激。谢谢!

【问题讨论】:

【参考方案1】:

几件事:

您不想将OneToOneField 放在SpeciesSpeciesPage 中指向对方。 (详见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'),
]

【讨论】:

非常感谢,像您描述的那样简化我的ListView 产生了预期的结果!另外,感谢您提供有关 OneToOneFields 的信息和链接,我没有意识到让它们相互指向是不好的做法。

以上是关于Django:遍历模板中的过滤列表的主要内容,如果未能解决你的问题,请参考以下文章

Django模板语法

Django模板语法

如何遍历 django 模板中的嵌套字典

Django:如何遍历模板内的两个列表[重复]

遍历字符串和列表的 Python/Django 模板

为啥 Django 模板不能从对象字段中识别列表?