Как показать список категорий в навигационной панели с помощью фреймворка django

enter image description here

hello Я хочу вывести список категорий в navbar из базы данных, но navbar является частичным представлением и я включил свой navbar в base.html . Как я могу передать данные в этот navbar

?

вот файл base.html, в который я включил частичное представление:

<body>
   {% include "includes/navbar.html" %}
</body>

это частичный вид:

<nav class="navbar navbar-expand-lg navbar-dark ">
    <div class="container-fluid">
        <a class="navbar-brand text-dark" href="#">TechNerd</a>
        <button aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation" class="navbar-toggler"
                data-bs-target="#navbarSupportedContent" data-bs-toggle="collapse" type="button">
            <span class="navbar-toggler-icon"></span>
        </button>
        <div class="collapse navbar-collapse" id="navbarSupportedContent">
            <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                <li class="nav-item">
                    <a class="nav-link" href="{% url 'post:posts' %}">Posts</a>
                </li>
                <li class="nav-item dropdown">
                    <a aria-expanded="false" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#"
                       id="navbarDropdown" role="button">
                        categories
                    </a>
                    <ul aria-labelledby="navbarDropdown" class="dropdown-menu">
                      <li><a class="dropdown-item" href="#">Action</a></li>
                      <li><a class="dropdown-item" href="#">Action</a></li>
                    </ul>
                </li>

            </ul>
        </div>
    </div>
</nav>

Вы можете создать свой собственный контекстный процессор, который будет запускаться при каждом запросе и передавать данные оттуда. Подробный ответ вы найдете в этой ссылке ( Переменная Django в base.html).

С помощью Context Processors вы можете передавать данные в шаблон. Таким образом, их можно использовать на каждой .html-странице.

your_project/context_processors.py

from .models import Category
def category_list(request):
    return {
        "category_urls": [
            {"name": category.name, "url": category.get_absolute_url()}
            for category in Category.objects.all()
        ]
    }

в settings.py

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [str(BASE_DIR / "templates")],
        "APP_DIRS": True,
        "OPTIONS": {
            "context_processors": [
                "django.template.context_processors.debug",
                "django.template.context_processors.request",
                "django.contrib.auth.context_processors.auth",
                "django.contrib.messages.context_processors.messages",
                "my_app.context_processors. category_list"
            ],
        },
    },
]

в base.html

{% for category in category_urls %}
    
    <a href="{{category.url}}">{{category.name }}</a>
{% endfor %}

Вы можете использовать custom context processor для добавления данных в контекст шаблона для каждого запроса.

# myapp/context_processors.py
from .models import Category

def catgories(request):
    return {
        "categories": Category.objects.all()
    }

# settings.py
TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        # ...your other settings....
        "OPTIONS": {
            "context_processors": (
                "django.contrib.auth.context_processors.auth",
                # ...other processors you use
                "myapp.context_processors.categories",
            ),
        },
    }
]

# my_template.html
{% for category in categories %}
     {{ category.name }}
{% endfor %}
Вернуться на верх