深入理解Django静态文件以及模板详解

Django运行模式

image

Django MTV图片介绍

image

静态文件

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',],},},]

模板

  • 使用构建html网页

  • 原始的:直接将html字符串硬编码到HttpResponse中。

class Login(View):def get(self, request):return HttpResponse("<h1>hello world</h1>")

  • 使用render进行渲染。

class Login(View):def get(self, request):return render(request, "login.html")

  • 使用django.template.loader下的get_template方法进行渲染。

class Login(View):def get(self, request):t = get_template("login.html")return HttpResponse(t.render())ps: 进阶用法,这里只是介绍

  • 模板引擎的选择

  • Django自带了一个模板系统,叫做DTL(Django Template Language)。

  • 一个比较流行的模板系统,叫做Jinja2。

  • 配置:可以在settings文件中的TEMPLATES->BACKEND进行配置,默认使用的是django自带的DTL。配置DTL:'BACKEND': 'django.template.backends.django.DjangoTemplates',配置Jinja2:django.template.backends.jinja2.Jinja2

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',],},},]
  • 模板变量

  • 先将值传进去

message = u"欢迎使用学员登录系统"return render(request, "login.html",{"message": message})ps: 如果不想引用,可以使用locals(),locals()指获取当前能获取到的变量,形成一个字典 例: return render(request, "login.html",locals())

  • 在模版中使用

  • 语法:{{变量名}}

  • 命名由字母和数字以及下划线组成,不能有空格和标点符号。

  • 不要和python或django关键字重名。原因:如果data是一个字典,那么访问data.items将会访问data这个字典的key名为items的值,而不会访问字典的items方法。

例:<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Title</title></head><body>{{ message }}</body></html>

  • 模板标签

  • 标签语法:{% 标签名称 %}{% 结束标签名称 %}例: {%tag%}{%endtag%}

  • if/elif/else:可以使用and/or/in/not/==/!=/<=/>=,来进行判断。ifequal/ifnotequal

{% if now %}当前时间: {{ now|date:"Y-m-d H:i:s" }}{% endif %}

  • for…in…:跟python中的for…in…是一样的用法

{% for m in modules %}{{ m }}{% end %}

  • forloop.counter:当前迭代的次数,下标从1开始。

  • forloop.counter0:当前迭代的次数,下标从0开始。

  • forloop.first:返回bool类型,如果是第一次迭代,返回true,否则返回false。

  • forloop.last:返回bool类型,如果是最后一次迭代,返回True,否则返回False。

  • 过滤器

  • 作用:对变量进行过滤。在真正渲染出来之前,过滤器会根据功能处理好变量,然后得出结果后再替换掉原来的变量展示出来。

  • 语法:{{greeting|lower}}

  • 变量和过滤器中间使用管道符号”|”进行使用。

  • 可以通过管道符号进行链式调用,比如实现一个功能,先把所有字符变成小写,把第一个字符转换成大写,代码如下:

{{message|lower|capfirst}}

  • 过滤器可以使用参数,在过滤器名称后面使用冒号”:”再加上参数,比如要把一个字符串中所有的空格去掉,则可以使用cut过滤器,代码如下

{{message|cut:" "}}ps: 使用参数的时候,冒号和参数之间不能有任何空格,一定要紧挨着。

  • R和time过滤器格式

获取当前时间import datetimedatetime.datetime.now(){{ now|date:"Y-m-d H:i:s" }}

  • 模板继承

  • 模板继承使用extends标签实现。通过使用block来给子模板开放接口。

  • extends必须是模板中的第一个出现的标签。

  • 子模板中的所有内容,必须出现在父模板定义好的block中,否则django将不会渲染。

  • 如果出现重复代码,就应该考虑使用模板。尽可能多的定义block,方便子模板实现更细的需求。

base.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
{% block js %}{% endblock js %}
</head>
<body>
{% block content %}{% endblock content %}
</body>
</html>login.html{% extends "base.html" %}
{% block content %}这是一个登录页面{% endblock %}
  • include另一个模板

{% include "menu.html" %}

  • 注释标签

  • {#被注释的内容#}:将中间的内容注释掉。只能单行注释。

  • {% comment %}被注释的内容{% endcomment %}:可以多行注释。

深入理解模板以及自定义过滤器

  • 自定义过滤器

  • DTL模板语言生来只是为了方便的展示信息,所以与编程语言相比显得有点薄弱,有时候不能满足我们的需求。因此django提供了一个接口,让开发者能自定义标签和过滤器。

  • 首先,你需要添加一个templatetags的文件夹, 自定义过滤器必须处在已经安装了的app中的一个名叫”templatetags”的包(文件夹)中。因此可以有两种选择:

  • 一种是放在其他已经安装了的app中。这种方式简单,但不方便管理。

  • 单独创建一个app,用来存放所有的自己定义的过滤器。

比如,我们现在有一个account的app

account

├── admin.py

├── apps.py

├── init.py

├── init.pyc

├── migrations

│ └── init.py

├── models.py

├── templatetags

│ ├── custom_tags.py

│ └── init.py

需要使用自定义过滤器,必须把对应的app加载,在settings中添加该app,假设我需要使用account下的自定义标签

INSTALLED_APPS = [

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'account'

]
  • 添加对应的自定义标签
from django import template

register = template.Library()   #代表此文件是自定义标签的包,register 不能作为更改,否则无法引用  过滤器

@register.filter

def mycut(value, args):

return value.replace(args, "").lower()

@register.simple_tag

def xx():       #  可以加参数

pass

ps: register = template.Library()register的命名是固定的,不能修改
  • 在模版中使用

{% extends "base.html" %}

{% load custom_tags %}  # load + 文件名

{% block content %}

{{ name|mycut:" " }}

{% endblock %}

ps: 创建完templatetags模块后,你需要重启服务器。

ps: 在模板中加载的是过滤器所在的文件名,而不是app的名称。

ps: pycharm创建文件夹时,不会自动上传

  • 模板加载静态文件

  • 在项目添加一个静态文件夹,并添加需要添加的静态文件(一般名叫static)

  • 配置静态文件settings


STATICFILES_DIRS = [

os.path.join(BASE_DIR, "static")

]

ps: 使用pycharm 创建完静态文件后,需要手动上传一次

  • 在需要使用的html模版头部中添加导入

{% load static %}
  • 使用
<script src="{% static '/js/jquery.min.js' %}"></script>
  • ps: 引入的路径是一个相对路径
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容