注意:这个问题不是关于创建或使用基本模板的!

我正在我的项目中创建一个products应用程序,只使用Django和html/css,这部分中的所有页面都有一个侧栏导航菜单,其中分类了不同的产品型号和类型.所以这个侧边栏将在所有其他产品页面中使用.

这是我的views.py%文件:

from django.shortcuts import render

from .models import (
    Product,
    Usage,
    SubUsage,
    MainModel,
    PumpType,
    HeadFlowDataSet,
)


def products_usage_main(request):
    product_queryset = Product.objects.all()
    usage_queryset = Usage.objects.all()
    sub_usage_queryset = SubUsage.objects.all()
    main_model_queryset = MainModel.objects.all()
    pump_type_queryset = PumpType.objects.all()
    context = {
        "product_queryset": product_queryset,
        "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_usage_main.html", context)


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()视图中发送的上下文数据将不会被发送,因此我的侧边栏将不会填充数据. 我怎么才能接受这个呢? 有一种方法,我必须在所有不同的产品页面中将查询集数据发送到侧边栏,但我认为应该有一种更充分的方法. 提前感谢您的帮助.

推荐答案

要实现这一点,您需要在所有视图中传递相同的上下文.以下是您的观点的简单演示:

Views.py

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



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

Django相关问答推荐

Django模型ManyToManyField.Add不起作用

为什么Docker compose没有这样的文件或目录?

如何在创建对象后立即运行一次代码?

Django中的DateTimeField到DateField

如何删除Docker上的django应用程序?

Django中用于外键的嵌套循环

如何使用邮箱确认码创建django注册

如何将数据库中的 None 序列化为空对象?

超级用户在基于类的视图中进行身份验证

我的 django 模板布尔变量在 javascript 中没有按预期工作

在 Bootstrap 中使单击的选项卡处于活动状态

django.core.exceptions.ImproperlyConfigured:请求设置 USE_I18N,但未配置设置

Django - 无法为具有动态 upload_to 值的 ImageField 创建迁移

在 Django 管理页面中注册应用程序中的每个表/类

Django REST Framework 和 FileField 绝对 url

如何动态检索 Django 模型类?

Matplotlib - Tcl_AsyncDelete:异步处理程序被错误的线程删除?

Django Rest Framework 序列化程序中的循环依赖

在 Django 中查询 top x 元素

如何使用 Django/nginx 部署仅限 HTTPS 的站点?