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

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

1
2
3
4
5
{% 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配置文件上会默认存在以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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可以发现以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

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

修改django配置文件settings.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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页面引用:

1
span>{{ django_verison }}</span>

Comments

2018-06-02