Django: Создание динамического шаблона боковой панели и использование его в других шаблонах

ПРИМЕЧАНИЕ: Этот вопрос не касается создания или использования базового шаблона!

Я создаю приложение products в своем проекте, используя только django и html/css, и все страницы этой части имеют боковое навигационное меню, которое классифицирует различные модели и типы продуктов. Эта боковая панель будет использоваться на всех остальных страницах товаров. Для категоризации товаров я создал следующее представление для боковой панели:

def sidebar_data(request):
    usage_queryset = Usage.objects.all()
    sub_usage_queryset = SubUsage.objects.all()
    main_model_queryset = MainModel.objects.all()
    pump_type_queryset = PumpType.objects.all()
    context = {
        "usage_queryset": usage_queryset,
        "sub_usage_queryset": sub_usage_queryset,
        "main_model_queryset": main_model_queryset,
        "pump_type_queryset": pump_type_queryset,
    }
    return render(request, "products/products_sidebar.html", context)

А шаблон боковой панели выглядит так, как показано ниже:

  <ul class="nav flex-column list-unstyled my-3 ms-3">
    {% for usage_item in usage_queryset %}
      <li class="nav-item p-2 ms-4">
        <a href="#" class="text-decoration-none nm-text-color fw-semibold"
           data-bs-toggle="collapse"
           data-bs-target="#usage_{{ usage_item.usage_name_fa }}">
           <i class="fa-solid fa-angle-left me-2 icon-selector"></i>
            الکتروپمپ‌های {{ usage_item.usage_name_fa }}
        </a>
        <ul class="submenu collapse" id="usage_{{ usage_item.usage_name_fa }}"
          data-bs-parent="#nav_accordion">
          {% for sub_usage in sub_usage_queryset %}
            {% if sub_usage.usage == usage_item %}
              <li class="my-2 ms-4">
                <a href="#" class="text-decoration-none nm-text-color fw-semibold">
                  {{ sub_usage }}
                </a>
              </li>
            {% endif %}
          {% endfor %}
        </ul>
      </li>
    {% endfor %}
  </ul>

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

    <section>
        <div class="container-fluid">
            <div class="row">
                <div class="col-6 col-lg-4 px-0">
                    {% include "products/products_sidebar.html" %}
                </div>
                <div class="col-6 col-lg-8">
                    content
                </div>
            </div>
        </div>
    </section>

Теперь, я знаю, что без URL, представление sidebar_data() не будет вызвано, и на данный момент мои URL такие, как показано ниже:

urlpatterns = [
    path("application/", products_usage_main, name="products_usage_main"),
    path("application/<str:pk>", product_detail, name="product_detail"),
]

Как и ожидалось, контекстные данные, отправленные в представлении sidebar_data(), не будут отправлены, и поэтому моя боковая панель не будет заполнена данными. Как я могу добиться этого? Есть один способ, в котором я должен отправить данные queryset, отправленные в sidebar на всех различных страницах продукта, но я думаю, что должен быть более достаточный способ. Заранее благодарен за помощь.

Для достижения этой цели вам необходимо передать один и тот же контекст во всех ваших представлениях. Простая демонстрация ваших представлений будет выглядеть следующим образом:

views.py

# Since these context will be common to all views it would be written outside any view function
usage_queryset = Usage.objects.all()
sub_usage_queryset = SubUsage.objects.all()
main_model_queryset = MainModel.objects.all()
pump_type_queryset = PumpType.objects.all()
common_context = {
    "usage_queryset": usage_queryset,
    "sub_usage_queryset": sub_usage_queryset,
    "main_model_queryset": main_model_queryset,
    "pump_type_queryset": pump_type_queryset,
}

# and in every other views
def products_usage_main(request):
    ...
    context_of_view = {
    ...
    }
    context = {**context_of_view, **common_context} # dictionary expansion
    return render(request, "template_name.html", context)

Вернуться на верх