django 上下文处理器

上下文处理器是可以返回一些数据,在全局模板中使用。

自定义上下文处理器:

我们每个视图函数都需要返回自己的数据,或者有其他的判断格式。这样就可以自己定义上下文处理器,不需要再每一个试图函数中都写同样的代码。精简代码

首先我们定义一个函数作为我们上下文处理器的名字,我们可以写一个判断是否登录的函数。

from .models import User

def front_user(request):
    user_id = request.session.get('user_id')
    context = {}
    if user_id:
        try:
            user = User.objects.get(pk=user_id)
            context['front_user'] = user
        except:
            pass
    return context

定义好之后可以直接在settings.py的TEMPLATES下的context_processors中就可以了。

'front.context_processors.front_user'

注:自定义上下文处理器最后一定要返回一个字典,即使是一个空的字典。

django中内置上下文处理器的原理:

上下文处理器是属于模板的 所以在TEMPLATES当中 的context_processors。

django中自带的有4个内置上下文处理器。

  1. debug:(django.template.context_processors.debug)增加一个debug和sql_queries变量。在模板中可以通过他来查看到一些数据库。

  2.request: (django.template.context_processors.request)增加一个request变量。这个request变量也就是在视图函数的第一个参数 

    • 使用时直接在网页上request.path  就会显示视图函数的第一个参数

  3.auth:(django.contrib.auth.context_processors.auth):django有内置的用户系统,这个上下文会增加一个user对象。

  4.messages:(django.contrib.messages.context_processages.messages):增加一个messages变量。

#forms.pyL里定义
def
get_error(self): new_errors = [] errors = self.errors.get_json_data() for messages in errors.values(): for message_dicts in messages: for key,message in message_dicts.items(): if key == 'messages': new_errors.append(message) return new_errors
#views.py里
from
django.contrib import messages #messages.add_message(request,message.INFO,'用户名或着密码错误‘) message.info('用户名或密码错误')

errors = form.get_error()
for error in errors:
messages.info(request,error)
return redirect(reverse('sign'))

   5.media:【django.template.context_processors.media】:在模板中可以读取MEDIA_URL.比如想要在模板中使用上传的文件,那么这时候只需要在settings.py中设置MEDIA_URL来拼接url   

    • 在urls.py文件的urlpatterns后面添加   +static(settings.MEDIA_URL,document_roo = settings.MEDIA_ROOT)  
    • 然后media文件下的东西  可以直接使用media路径。
    • 要在settings.py中添加django.template.context_processors.media

  6.static (django.template.context_processors.static)  在模板中可以使用static_url

  7.csrf:(django.remplate.context_processors.csrf)  在模板中可以使用csrf_token变量来生成一个csrf token

    • 在表单中直接使用{% csrf_token %}
    • 也可以用input   {<input type='hidden' name='csrfmiddlewaretoken' value='{{csrf_token}}'> }
原文地址:https://www.cnblogs.com/nihao2/p/12331479.html