django中级 --- RequestContext

在django中默认使用Context传递数据,一个Context是一系列变量和值的集合,它和Python的字典有点相似

例:

def view_1(request):
    # ...
    t = loader.get_template('template1.html')
    c = Context({
        'app': 'My app',
        'user': request.user,
        'ip_address': request.META['REMOTE_ADDR'],
        'message': 'I am view 1.'
    })
    return t.render(c)
     
def view_2(request):
    # ...
    t = loader.get_template('template2.html')
    c = Context({
        'app': 'My app',
        'user': request.user,
        'ip_address': request.META['REMOTE_ADDR'],
        'message': 'I am the second view.'
    })
return t.render(c)

view_1和view_2中每个视图给模板传了3个相同的变量:app、user、ip_address,这增加了代码的冗余,此时使用RequestContext
方法一:

def custom_proc(request):
    "A context processor that provides 'app', 'user' and 'ip_address'."
    return {
        'app': 'My app',
        'user': request.user,
        'ip_address': request.META['REMOTE_ADDR']
    }

def view_1(request):
    # ...
    t = loader.get_template('template1.html')
    c = RequestContext(request, {'message': 'I am view 1.'},
        processors=[custom_proc])
    return t.render(c)
     
def view_2(request):
    # ...
    t = loader.get_template('template2.html')
    c = RequestContext(request, {'message': 'I am the second view.'},
        processors=[custom_proc])
    return t.render(c)

方法二:
setting.py中TEMPLATES_CONTEXT_PROCESSORS项,django1.8在TEMPLATES中

 'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'myproject.context_processors',
            ],
        },
vim context_processors.py
def name_proc(request):
    user_id = request.user.id
    ......

    info_dic = {
        'session_user_id': user_id,
        ......
    }
    return info_dic

模板中即可直接调用:{{ session_user_id }}
RequestContext依次调用这些processors,往当前context中放入这里定义的默认变量。可自定义一个processors然后添加到这里。注意:使用RequestContext时,应作为第三个参数传入

  • django.core.context_processors.auth
    如果 TEMPLATE_CONTEXT_PROCESSORS 包含了这个处理器,那么每个 RequestContext 将包含这些变量:
  1. user :一个 django.contrib.auth.models.User 实例,描述了当前登录用户(或者一个 AnonymousUser 实例,如果客户端没有登录)。
  2. messages :一个当前登录用户的消息列表(字符串)。 在后台,对每一个请求,这个变量都调用 request.user.get_and_delete_messages() 方法。 这个方法收集用户的消息然后把它们从数据库中删除。
  3. perms : django.core.context_processors.PermWrapper 的一个实例,包含了当前登录用户有哪些权限。
  • django.core.context_processors.i18n
    如果这个处理器启用,每个 RequestContext 将包含下面的变量.
  1. LANGUAGES : LANGUAGES 选项的值
  2. LANGUAGE_CODE :如果 request.LANGUAGE_CODE 存在,就等于它;否则,等同于 LANGUAGE_CODE 设置
  • django.core.context_processors.request
    如果启用这个处理器,每个 RequestContext 将包含变量 request , 也就是当前的 HttpRequest 对象。 注意这个处理器默认是不启用的,你需要激活它
    如果你发现你的模板需要访问当前的HttpRequest你就需要使用它:
    {{ request.REMOTE_ADDR }}

你可能感兴趣的:(django中级 --- RequestContext)