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

问题描述 投票:0回答:1

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

为了解决我的问题,我从这里使用了以下答案:

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

django django-templates django-views django-filter
1个回答
0
投票

事物的结合:

您不想将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'),
]
© www.soinside.com 2019 - 2024. All rights reserved.