作为一个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 %}
事实上,我们都清楚Django
的MTV
,但是这里很明显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.DjangoTemplates
和 django.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>