Меню для django сайта

19 Сен 2016 , 415

Как-то мне понадобилось реализовать меню на сайте, где пункты меню брались из базы данных.

На сайтах, которые я ранее писал на 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.

Если будут вопросы , то с радостью отвечу на них в комментариях

comments powered by Disqus

Подписка

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

Рубрики

Теги