Меню для django сайта
Как-то мне понадобилось реализовать меню на сайте, где пункты меню брались из базы данных.
На сайтах, которые я ранее писал на PHP это реализовывалось довольной легко, а вот на DJANGO я сразу не мог это реализовать. Самый топорный , это конечно же передавать пункты меню в шаблон в каждой вьюхе ))
Но погуглив , я понял, что это реализуется довольно легко с помощью пользовательских template tags.Но для новичков ,это вначале проблематично и поэтому это статья для них.
Создадим новый app
python manage.py startapp cms
В файле models.py создадим модель для Menu.
from django.db import models
class Menu(models.Model):
name = models.CharField('Название', max_length=100)
url = models.CharField('Ссылка', max_length=255)
position = models.PositiveIntegerField('Позиция', default=1)
def __str__(self):
return str(self.name)
class Meta:
ordering = ('position',)
verbose_name = 'Пункт меню'
verbose_name_plural = Пункты меню'
Внутри нашего приложения cms создадим папку templatetags. Внутри этой папки создайте пустой файл __init__.py
В папке templatetags создадим файл common_tags.py
from django import template
from cms.models import Menu
register = template.Library()
@register.inclusion_tag('menu.html', takes_context=True)
def show_top_menu(context):
menu_items = Menu.objects.all()
return {
"menu_items": menu_items,
}
Содержимое файла menu.html
<ul class="menu">
{% for m_item in menu_items %}
<li><a href="{{ m_item.url }}">{{ m_item.name }}</a></li>
{% endfor %}
</ul>
Мы создали наш шаблонный включаемый тег с названием show_top_menu с помощью метода inclusion_tag. Ему нужно передать в качестве параметра путь к файлу шаблона (в нашем случае menu.html), где будет html код. Туда мы можем передать пункты меню и другие параметры, которые нужно вывести.
Теперь мы можем в базовом шаблоне base.html включить этот наш шаблонный тэг с пунктами меню следующим образом.
{% load common_tags %}
# В нужном месте вставляете ваше меню
{% show_top_menu %}
Заключение
В данной статье бы показан как с помощью пользовательских шаблонных тегов выводить пункты меню. В частности для этого был использован метод inclusion_tag.
Если будут вопросы , то с радостью отвечу на них в комментариях