如何在Django中显示子类别的子子类别?

时间:2019-04-25 06:05:56

标签: python django

我有以下型号:

class TutorialCategory(models.Model):
    category_title = models.CharField(max_length=150)
    category_summary = models.CharField(max_length=150)
    category_slug = models.SlugField(default=1, blank=True) 

class TutorialSeries(models.Model):
    series_title = models.CharField(max_length=200)
    series_maincategory = models.ForeignKey(
        TutorialCategory, default=1, on_delete=models.SET_DEFAULT)
    series_summary = models.CharField(max_length=200)

class Tutorial(models.Model):
    tutorial_title = models.CharField(max_length=150)
    tutorial_content = models.TextField()
    tutorial_published = models.DateTimeField(
        "date Published", default=datetime.now())
    tutorial_series = models.ForeignKey(
        TutorialSeries, default=1, on_delete=models.SET_DEFAULT)
    tutorial_slug = models.SlugField(default=1, blank=True)

如上所示,TutorialCategory是主要类别,TutorialSeries是子类别,Tutorial是子子类别。我创建了一个简单的视图,该视图显示主要类别的子类别,但是不知道如何显示子类别的子子类别。 请检查views.pyurls.py是否可以提高其质量,以及是否有简便而又更好的方法。无论如何,这是视图:

def single_slug(request, single_slug):
    matching_series = TutorialSeries.objects.filter(
        series_maincategory__category_slug=single_slug)

    series_urls = {}
    for i in matching_series.all():
        part_one = Tutorial.objects.filter(

tutorial_series__series_title=i.series_title).earliest("tutorial_published")
    series_urls[i] = part_one.tutorial_slug

return render(request, 'tutorial/sub-category.html', context={
    "tutorial_series": matching_series,
    'part_ones': series_urls
})

在这里网址:

urlpatterns = [
    path('', views.home_page, name='home'),
    path('tutorial/<int:id>/', views.tutorial_detail, name='tutorial_detail'),
    path('<single_slug>/', views.single_slug, name='single_slug'),
]

显示主要类别子类别的模板

   {% for tut, partone in part_ones.items %}

    <div class="card">
        <div class="card-body">
            <h5 class="card-title">{{ tut.series_title }}</h5>
            <p>{{ tut.series_summary }}</p>
            <a href="{{ partone }}">Read more</a>
        </div>
    </div>
    {% endfor %}

请帮助我该怎么做,如果您知道更好的方法,请告诉我并帮助我。提前非常感谢您。

编辑:@ruddra 我将views.py更改为通过的matching_series

def single_slug(request, single_slug):
    matching_series = TutorialSeries.objects.filter(
        series_maincategory__category_slug=single_slug)

    series_urls = {}
    for i in matching_series.all():
        part_one = Tutorial.objects.filter(
            tutorial_series__series_title=i.series_title).earliest("tutorial_published")
        series_urls[i] = part_one.tutorial_slug

    return render(request, 'tutorial/sub-category.html', context={
        "matching_series": matching_series,
        'part_ones': series_urls
    })

,并用您的模板替换了先前的模板。模板在这里:

    {% for tutorial in matching_series %}
        {% for sub_cat in tutorial.tutorialseries_set.all %}
            {{ sub.series_title }}

            {% for sub_sub_cat in sub.tutorial_set.all %}
                {{ sub_sub_cat.tutorial_title }}
            {% endfor %}
        {% endfor %}
    {% endfor %}

1 个答案:

答案 0 :(得分:1)

您可以尝试这样:

 {% for sub_cat in matching_series %}
          {% for sub_sub_cat in sub_cat.tutorial_set.all %}
             {{ sub_sub_cat.tutorial_title }}
          {% endfor %}
  {% endfor %}

在这里,我假设matching_series中的single_slug正在通过上下文传递。然后,我在不同的模型之间使用backward relation来获取数据。

说明::假设有一个名为tutorial_category的对象,它是TutorialCategory的实例。由于从TutorialSeriesTutorialCategory有ForeignKey,所以我可以使用tutorial_category.tutorialseries_set.all().filter()等从tutorial_category对象中获取教程系列(我正在渲染它)在模板中,我在all之后删除了括号。同样,我从Tutorial获取了TutorialSeries