Django自定义上下文处理器

在如何自定义之前 我们先来看一下正常的前后端交互方式

  1. 从seesions获取数据,用render方法,传递数据到模板中
# views.py
def index(request):
    user_id = request.session.get('user_id')
    context = {}
    if user_id:
        try:
            user = User.objects.get(pk=user_id)
        except:
            pass
        context['login_user_name']= user.username
    return render(request, 'index.html', context=context)
  1. 模板接收数据并判断处理数据,然后显示到前端
<ul class="nav navbar-nav navbar-right">
  {% if login_user_name %}
  <li><a href="#">{{ login_user_name }}</a></li>
  {% else %}
  <li><a href="{% url 'signin' %}">登录</a></li>
  <li><a href="{% url 'signup' %}">注册</a></li>
  {% endif %}

</ul>

这样的方法我们不难发现,用户的session几乎涉及网站的各个views,难道每个视图函数下都要加上对于session的获取、传递吗。这显然是不优雅的。

自定义

Django为我们提供了自定义上下文处理器的接口

  1. settings中的TEMPLATES下的OPTIONS['context_processors']是Django为我们提供的接口
# settings.py
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ,
        'APP_DIRS': True,
        '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',
            ],
        },
    },
]
  1. 编写自己的上下文处理器

    1)在app下定义context_processors.py文件

    # context_processors.py
    from app01.models import User
    
    
    def CheckUser(request):
        user_id = request.session.get('user_id')
        context = {}
        if user_id:
            try:
                user = User.objects.get(pk=user_id)
            except:
                pass
            context['login_user_name']= user.username
    
        return context
    

    2)上下文处理器的格式:

    一个函数,接收request参数

    返回一个字典(可为空)

    3)settings中注册该文件

    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            'DIRS': [os.path.join(BASE_DIR, 'templates')]
            ,
            'APP_DIRS': True,
            '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',
                    'app01.context_processors.CheckUser',
                ],
            },
        },
    ]
    
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 模板标签除了几个常用的,还真心没有仔细了解一下,看到2.0发布后,翻译学习一下。 本文尽量忠实原著,毕竟大神的东西...
    海明_fd17阅读 2,141评论 0 5
  • 上下文处理器 上下文处理器是可以返回一些数据,在全局模板中都可以使用。比如登录后的用户信息,在很多页面中都需要使用...
    yungege阅读 196评论 1 0
  • 简介:自学django,从搭建简单的购物网站开始,网站的功能不完整,目前完成:用户注册,用户登录和注销,商品展示,...
    IBigBin阅读 3,693评论 0 8
  • 微信小程序之实现登录功能代码 models.py from django.db import modelsclas...
    lijingqi_hbut阅读 307评论 0 0
  • 序言 作为一个测试人员如果你有以下疑问,那么这篇文章将对你有很大帮助! 1.网站的业务功能是如何实现的?参考章节:...
    测试开发Kevin阅读 708评论 0 9

友情链接更多精彩内容