在基本模板中包含视图

Include view in base template

我正在制作一个简单的博客应用程序,我希望在网站每个页面的导航栏中都有博客类别。

我是否必须将 categories = Category.objects.all() 对象传递给每个视图,或者是否有任何简单的方法可以实现此目的?

是的,看context processors:

myapp/context_processors.py

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

然后将其添加到 TEMPLATE_CONTEXT_PROCESSORS 设置中:

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    "myapp.context_processors.categories",
)

有更简单的解决方案,可以使用template context processor。只需在名为 context_processors 的应用程序文件中创建(该文件的名称无关紧要,但好的做法是这样命名)并在该文件中创建任何将接受请求参数和 return 的函数带有附加上下文变量的字典。示例:

from .models import Category

def categories(request):
    categories = Category.objects.all()

    return {
        'categories': categories,
    }

现在只需将您的上下文处理器添加到设置中:

TEMPLATE_CONTEXT_PROCESSORS += (
    'yourapp.context_processors.categories',
)