zoukankan      html  css  js  c++  java
  • 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}}'> }
  • 相关阅读:
    怎么说???
    再给自己一点鼓励
    还是不要看新闻的好
    系统架构师
    朋友
    未来的路
    I now have a dream
    纪念死去的手机
    全局规划
    终于要上战场了!
  • 原文地址:https://www.cnblogs.com/nihao2/p/12331479.html
Copyright © 2011-2022 走看看