Намудрил с темплейтом и контекстним процессором Django

Не правильно работает рендер страниц. введите сюда описание изображения

contex proc

from django.utils.safestring import mark_safe
from .models import TypePage, Page


def base_list_type_page(request):
    categories = {}
    for catagory in TypePage.objects.all():
        categories[catagory.name] = mark_safe(catagory.name)
    return {'categories': categories}


def base_list_page(request):
    pages = {}
    for page in Page.objects.all():
        pages[page.title_m] = mark_safe(page.title_m)
    return {'pages': pages}


def base_name_page(request):
    names = {}
    for name in Page.objects.all():
        names[name.url_page] = mark_safe(name.url_page)
    return {'names': names}


def base_urls_page(request):
    urls = {}
    for url in Page.objects.all():
        urls[url.url_page] = mark_safe(url.url_page)
    return {'urls': urls}

base.html

 <nav class="desktopNav">
          <a href="index" class="desktopNav__link">головна</a>
            {% for list  in categories %}
          <div class="dropdown">
            <div class="dropdown__title">{{ list }}</div>
            <div class="dropdown__content">
                {% for list_name in names %}

                {% for list_page in pages %}
                    {% for list_url in urls %}
              <a href="{{ list_url }}" class="dropdown__content__link">{{ list_page }}</a>
                {% endfor %}
                    {% endfor %}

                {% endfor %}

                    </div>

          </div>
{% endfor %}

models.py

from django.db import models
from django.urls import reverse


class TypePage(models.Model):
    name = models.CharField('Введіть назву категорії', max_length=200)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'Категорія'
        verbose_name_plural = 'Категорії'


class Page(models.Model):
    title_page = models.CharField('Title (seo) сторінки', default='BudModa', max_length=50)
    title_m = models.CharField('Назва сторінки', max_length=100)
    background_img = models.ImageField('Беграундна картинка', upload_to='static/media', null=True, blank=True)
    slide_img_one = models.ImageField('1 Картинка в слайдері', upload_to='static/media', null=True, blank=True)
    slide_img_two = models.ImageField('2 Картинка в слайдері', upload_to='static/media', null=True, blank=True)
    slide_img_three = models.ImageField('3 Картинка в слайдері', upload_to='static/media', null=True, blank=True)
    title_text = models.CharField('Заголовок тексту', max_length=200)
    main_text = models.TextField('Опис сторінки')
    categories = models.ForeignKey('TypePage', on_delete=models.SET_NULL, null=True)
    url_page = models.SlugField('Юрл сторінки', max_length=130, default=0, unique=True)

    def display_typepage(self):
        return ', '.join([categories.name for categories in self.categories.all()[:3]])
        display_typepage.short_description = 'TypePage'

    def __str__(self):
        return self.title_m

    def get_absolute_url(self):
        return reverse('page_d', kwargs={"slug": self.url_page})

    class Meta:
        verbose_name = 'Сторінка'
        verbose_name_plural = 'Сторінки'

введите сюда описание изображения

categories

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Andrey Maslov

Почему бы не объединить контекст процессоры

def base_page_details(request):
    pages = []
    for page in Page.objects.all():
        pages.append({
           'url': mark_safe(page.url_page),
           'title': mark_safe(page.title_m),
        })
    return {'pages': pages}

тогда в шаблоне для того, что бы пробежаться по списку страниц достаточно одного цикла

{% for page in pages %}
  <a href="{{ page.url }}" class="dropdown__content__link">{{ page.title }}</a>
{% endfor %}

Только логика на мой взгляд все равно не верна у тебя, так как ты для каждой категории будешь выводить весь список страниц. Если тебе нужно, что бы в каждой категории выводились только свои страницы, тогда необходимо будет пересмотреть контекст процессоры

Второй вариант, когда сразу заполняем категории со списком страниц в этой категории:

def get_categories(request):
    categories = {}
    for category in TypePage.objects.all():
        categories[category.id] = {
          "name": mark_safe(category.name),
          "pages": [], 
        }
    for page in Page.objects.values("url_page", "title_m", "categories_id"):
        if page["categories_id"]:
           categories[page["categories_id"]]["pages"].append({
               'url': mark_safe(page["url_page"]),
               'title': mark_safe(page["title_m"]),
            })
    return {'categories': categories}

и в шаблоне у тебя будет цикл:

 {% for category_id, category in categories.items %}
          <div class="dropdown">
            <div class="dropdown__title">{{ category.name }}</div>
            <div class="dropdown__content">
                {% for page in category.pages %}
                 <a href="{{ page.url }}" class="dropdown__content__link">{{ page.title }}</a>
                {% endfor %}

            </div>
         </div>
   {% endfor %}
→ Ссылка