Django:如何在不复制和粘贴的情况下将视图扩展到另一个视图?

Django: how to extends a view to another view without copy and paste?

我有一个显示我的导航栏的视图,我正在从数据库中动态添加导航栏,但问题是我必须将相同的代码添加到我的所有视图中才能显示导航文本这让我的代码变得如此冗长,有没有一种方法可以自动扩展让我导航到所有视图的代码片段,所以当我转到另一个页面,如关于页面或联系人或个人资料页面时,我可以仍然看到导航栏。现在只有当我看到导航栏时,我才会转到 index.html

views.py

def index(request):
    designcatlist = DesignCategory.objects.all()
    prglangcatlist = ProgrammingLanguagesCategory.objects.all()
    howtocatlist = HowToCategory.objects.all()
    context = { ... }

def about_page(request):
    designcatlist = DesignCategory.objects.all()
    prglangcatlist = ProgrammingLanguagesCategory.objects.all()
    howtocatlist = HowToCategory.objects.all()
    context = { ... }

def contact_page(request):
    designcatlist = DesignCategory.objects.all()
    prglangcatlist = ProgrammingLanguagesCategory.objects.all()
    howtocatlist = HowToCategory.objects.all()
    context = { ... }

def profile_page(request):
    designcatlist = DesignCategory.objects.all()
    prglangcatlist = ProgrammingLanguagesCategory.objects.all()
    howtocatlist = HowToCategory.objects.all()
    context = { ... }

注意 正如您在上面的代码中看到的,我需要为导航添加相同的代码以显示在这些页面上。

如果您使用基于 class 的视图,它们可以相互继承。

https://docs.djangoproject.com/en/4.0/topics/class-based-views/

我认为您可以使用 custom context processor 将所有这些数据添加到您的模板中。 示例:

import models
def index(request):
    """Custom context processor."""
    designcatlist = DesignCategory.objects.all()
    prglangcatlist = ProgrammingLanguagesCategory.objects.all()
    howtocatlist = HowToCategory.objects.all()
    
    return {
        'designcat': designcatlist,
        'prglangcat': prglangcatlist,
        'howtocat': howtocatlist,
    }

创建它或它们后(因为您可以只创建一个包含所有数据或多个:每个函数一个)只需将其添加到 TEMPLATES.OPTIONS.context_processors。 文档解释说可以存在于任何地方,所以你决定是否要放入自己的应用程序或其他包中。

TEMPLATES = [
   {
       ...,
       OPTIONS: {
         'context_processors': [
              "other.django.processors",
              "package.processor.index",
          ]
       }
}]

现在,处理器返回的所有值都可以在模板中使用。因此,在您的模板中,仅使用在处理器中返回它的 dict 键来调用它,就好像它们在正常上下文中一样:{{howtocat}}.