Намудрил с темплейтом и контекстним процессором 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 %}

