我想知道如何将变量传递给所有模板,而不必在视图中的每个方法上重复相同的代码.py文件?

在下面的例子中,我想让类别(类别对象的数组)可用于web应用程序中的所有模板.

Eg: I would like to avoid writing 'categories':categories on every method. Is it possible?

One view method

def front_page(request):
    categories = Category.objects.all()
    if is_logged_in(request) is False:
        return render_to_response('users/signup.html', {'is_logged_in': is_logged_in(request), 'categories':categories}, context_instance=RequestContext(request))
    else:
        return render_to_response('users/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))

Another view method

def another_view_method(request):
    categories = Category.objects.all()
    return render_to_response('eg/front_page.html', {'is_logged_in': is_logged_in(request), 'categories':categories},context_instance=RequestContext(request))

推荐答案

你需要的是一个上下文处理器,创建一个上下文处理器非常容易.假设您有一个名为custom_app的应用程序,请执行以下步骤:

  • settings.py中加custom_appINSTALLED_APPS(你已经做到了,对吧?);
  • 创建一个context_processors.pyInto custom_app文件夹;
  • 将以下代码添加到该新文件:

    def categories_processor(request):
     categories = Category.objects.all()            
     return {'categories': categories}
    
  • settings.py中将context_processors.pyTEMPLATE_CONTEXT_PROCESSORS相加

    TEMPLATE_CONTEXT_PROCESSORS += ("custom_app.context_processors.categories_processor", )
    

现在你可以在所有的模板中使用{{categories}}:D

As of Django 1.8

要添加TEMPLATE_CONTEXT_PROCESSORS,您必须在设置中添加下一个代码:

TEMPLATES[0]['OPTIONS']['context_processors'].append("custom_app.context_processors.categories_processor")

或者将该字符串直接包含在TEMPLATES设置的OPTIONS.context_processors键中.

Django相关问答推荐

查尔而不是瓦尔查尔加盟Django 球场

Django Model邮箱字段是必需的,即使在我将其设置为NULL=True和BLACK=True之后也是如此

APIView查询未返回任何结果

django-filter compose 过滤的 url

Django中的InvalidOperation错误[]

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

使用 Crispy Forms 时 Django 返回 'TemplateDoesNotExist'

如何连接到 docker 容器中的 postgres 数据库?

Django ModelForm提交按钮不起作用

如何让 Django 在模板更改时重新启动运行服务器?

为 Django 模型生成非顺序 ID/PK

Django,如何从模型表单的 Select 字段中删除空白 Select ?

如何在 django 模板中将名称反转为绝对 url?

django- nginx: [emerg] open() "/etc/nginx/proxy_params" 在 /etc/nginx/sites-enabled/myproject:11 中失败(2:没有这样的文件或目录)

has_object_permission 和 has_permission 有什么区别?

settings.DATABASES 配置不正确使用 django 1.4 执行 syncdb 时出错

如何在 django 中使用更少的 css?

AUTH_USER_MODEL 指的是尚未安装和创建的模型 .. AbstractUser 模型无法登录

Jinja2中的多级模板继承?

django select_related - 何时使用它