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)