Как отобразить подкатегорию подкатегории в Django?

#python #django

#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.py и urls.py можете ли вы улучшить его качество, и если есть простой и лучший способ сделать это. В любом случае, это view:

 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
})
  

url-адреса здесь:

 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. Предполагая, что ошибка заключается в том, что часть вашего шаблона, которую вы опубликовали, не отображается на странице: вы проверили, содержит ли какой-либо из part_one наборов запросов в представлении что-либо (просто распечатайте это на консоли)? Возможно, запросы просто пусты и, следовательно, {% for %} цикл просто никогда не выполняется.

Ответ №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 . Затем я использую обратную связь между различными моделями для извлечения данных.

Объяснение: Предполагается, что существует объект с именем, tutorial_category который является экземпляром TutorialCategory . Поскольку есть ForeignKey from TutorialSeries to TutorialCategory , я могу использовать tutorial_category.tutorialseries_set.all() or .filter() etc для извлечения серии учебных пособий из tutorial_category объекта (поскольку я визуализирую его в шаблоне, я убрал скобки после all ). Аналогично я извлекаю Tutorial из TutorialSeries .

Комментарии:

1. Спасибо @ruddra, я только что отредактировал свой ответ. Я передал matching_series из представления в шаблон и заменил backward relation своим предыдущим кодом. Это не сработало, что я сделал не так?

2. Я допустил ошибку в своем коде. Я обновил ответ. Пожалуйста, попробуйте обновленный ответ

3. те же результаты @ruddra

4. что произойдет, если вы попытаетесь с {% for tutorial in tutorial_series %} ?

5. не работает, брат, теперь он даже не отображает подкатегорию. Вы хотите получить и просмотреть все коды для проверки