本文目录


    Django模板之全局变量

    作为一个Web框架,Django需要一种方便的方式来动态生成HTML。最常用的方法依赖于模板。相信Django中的templates模板大家遇到很多,今天我们来简单探讨下模板变量。

    在说模板变量之前我们可以先看看以下例子,在编写web日常中,我们经常会简单判断是否登录,如果没有登录,则显示请登录(或跳转到登录界面)。

    {% if user.is_authenticated %}
        <span class="username username-hide-on-mobile"> {{ user.username }} </span>
    {% else %}
        <span class="username username-hide-on-mobile"> Please log in </span>
    {% endif %}

    事实上,我们都清楚DjangoMTV,但是这里很明显views.py并没有定义user.is_authenticated,那么这里变量是如何产生的尼?

    如果细心的应该可以发现在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.messages.context_processors.messages',
                ],
            },
        },
    ]

    BACKEND是实现Django模板后端API的模板引擎类的Python路径。默认是django.template.backends.django.DjangoTemplatesdjango.template.backends.jinja2.Jinja2

    DIRS 定义引擎应该查找模板源文件的目录列表。

    APP_DIRS 告诉引擎是否应该在已安装的应用程序中查找模板。 OPTIONS 包含后端特定的设置。 认真的你,通过django.contrib.auth.context_processors.auth可以发现以下代码:

    def auth(request):
        """
        Return context variables required by apps that use Django's authentication
        system.
    
        If there is no 'user' attribute in the request, use AnonymousUser (from
        django.contrib.auth).
        """
        if hasattr(request, 'user'):
            user = request.user
        else:
            from django.contrib.auth.models import AnonymousUser
            user = AnonymousUser()
    
        return {
            'user': user,
            'perms': PermWrapper(user),
        }

    看到这里是否明白了点尼?我们称之为默认变量或者全局变量。 要是小伙伴还不明白可以进一步查阅官方文档 https://docs.djangoproject.com/zh-hans/2.0/topics/templates/

    例子: 既然上面说了那么多,全局变量到底怎么使用尼?简单举个例子,假设WEB前端存在多个页面都需要获取同一个相同的数据,那样子则可以设置全局变量,在需要使用的页面上直接应用就行了。

    以下是简单例子,具体可按照实际需要来更改,首先在apps下新增utils目录,然后新增contexts.py

    def django_verison(request):
        return {'django_verison':'2.1'}

    修改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',
                    'apps.utils.contexts.django_verison',
                ],
            },
        },
    ]

    前端页面html页面引用:

    span>{{ django_verison }}</span>

    原文链接