我有以下型号:
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.py
和urls.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 %}
答案 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
的实例。由于从TutorialSeries
到TutorialCategory
有ForeignKey,所以我可以使用tutorial_category.tutorialseries_set.all()
或.filter()
等从tutorial_category
对象中获取教程系列(我正在渲染它)在模板中,我在all
之后删除了括号。同样,我从Tutorial
获取了TutorialSeries
。