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}}'> }