十二、模板变量和路径映射
1.硬编码
def test1(request):
return HttpResponse('<h1 style='color:red'>我是前端代码</h1>')
html文件写到模板文件中,
1.模板放到app目录下templates文件夹下(得自己创建在相应的app目录下)
2.集中的放到一个目录(templates)中:在公共的CRM目录下创建templates的文件夹,把所有app的页面都放在里面。
1.创建模板
1.在总目录下创建tempaltes
-
模板要放到特定的文件夹中,在项目根目录下(和manage.py同级)去创建一个文件夹。
-
settings.py里的TEMPLATES的DIRS=[]里面设置路径os.path.join(BASE_DIR,‘templates’)
-
在templates的目录下创建对应名称的app文件夹,用来存放模板文件。
-
在相应的app文件夹下写入html文件
-
再回到对应的视图文件下
-
from django.template.loader import get_template#先导入这个模板 def test1(request): t = get_template('student/test.html') html = t.render() return HttpResponse(html) ### 实际 return render(request,'student/test.html')
2.在模板app下创建templates
- 在app下创建templates的文件夹
- 在CRM的setting.py文件下寻找INSTALLED_APPS的代码下加入student这个代码
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'student',
'teacher',
]
在student的views里设置相应的代码
def test2(request):
return render(request,'test3.html')
3.总结
- 模板有两种存放方式:1.在app目录下创建一个templates去存放。2.根目录下定义一个目录集中存放。
- 如何选择:1.一般情况下,我们会选择集中存放。2.如果我们要编写可重复使用的app时。
- 为什么我们要在templates文件夹下创建以app名字命名的文件夹?
不同应用会有同名的模板,所以为了区分不同应用的模板,所以要这样。
2.模板变量
1.静态页面、动态页面
2.模板变量的语法:{{ 变量名 }}
- 变量的命名规则:与其他的命名规则相同。
3.模板过滤器
可以让我们在模板文件上直接对模板变量进行在处理
- 常用的过滤器ppt中有第11页
data:日期时间格式
time:时间格式
add:相加,add如果是数字型的字符串会先转为整数如果是其他字符串,会给空值
safe:跨域脚本攻击(xss)
<p>{{ js|safe }}</p>
如果不加safe则只能显示这行代码
如果加了safe那么这段代码将执行
1.反射型
2.存储型
模板的例子:
def test4(request):
now = datetime.now() #获取当前时间
# now = now.strftime('%Y年%m月%d日 %H:%M: %S')
date_format = "Y年m月d日 H:i:s"
lt = [4,5,6]
dt = {"name":'summer',"age":18,"height":182}
st = 'hello world'
js = "<script>alert('1')</script>"
lt:lt
dt:dt
st:st
date_format:date_format
js:js
return render(request, 'student/test4.html',context={'now':now,'lt':lt,'dt':dt,'st':st,'date_format':date_format,'js':js})
<p>现在时间是:{{ now|date:"Y年m月d日 H:i:s" }}</p>
<p>我是一个列表:{{ lt }}</p>
<p>我是一个列表的一个值:{{ lt.1 }}</p>
<p>我是一个列表的一个值相加:{{ lt.1|add:'8' }}</p>
<p>我是一个列表的一个值相加:{{ lt.1|add:'a' }}</p>{#会失败#}
<p>我是一个列表的第一个值:{{ lt|first}}</p>
<p>我是一个列表的最后一个值:{{ lt|last}}</p>
<p>我是一个列表的切片:{{ lt|slice:':::-1'}}</p>
<p>我是一个列表的拼接:{{ lt|join:'//'}}</p>
<p>我是一个列表的拼接:{{ lt|join:'//'}}</p>
<p>我是英文字符串:{{ st }}</p>
<p>我是英文字符串:{{ st|capfirst }}</p>
<p>我是英文字符串:{{ st|upper }}</p>
<p>我是一个字典:{{ dt }}</p>
4.总结
- 模板过滤器的语法
{{ name|过滤器 }}
{{ name|过滤器:字符串参数 }}
字符串参数可以是字符串也可以使模板变量
-
设置模板变量的步骤
1.进行变量赋值。2.变量的声明3.进行变量的传参
-
注意事项
模板里面不能空格–》冒号前后不能空格
一个变量可以过滤多次
5.静态文件的导入(css,js,html)
1.公共目录
2.app下
- 统一放在项目根目录下,static的文件夹
- static文件夹下创建好app同名的文件夹
- 配置:并且在setting里STATIC下面一行设置
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')]
不推荐直接从根目录下的static文件导入css等文件。解决方法
在网页的第一行加上{% load static %}
然后设置:这样可以不随static_url的改变而重新改变整个文档
<link rel="stylesheet" href="{% static 'student/css/index.css' %}">
6.bootstrap
https://v4.bootcss.com/docs/4.3/examples/
去这个网站寻找实例
首先拿到源代码,然后在static文件的相应的文件夹下创建各自的html和css文件。导入的css也需要重新放进去。
在views里设置相应的视图并且在urls里设置相应的路由,注意!在HTML的文件里一定要在第一行加上{% load static%}然后link里的href放{% static ‘放路径’%}这样可以保证STATIC_URL改变的情况下也能拿到相应的文件。
7.模板标签
一般;
<table>
<tr>
<th>序号</th>
<th>姓名</th>
<th>年龄</th>
<th>升高</th>
<th>性别</th>
</tr>
<tr>
<td>1</td>
<td>{{ students.0.name }}</td>
<td>{{ students.0.age }}</td>
<td>{{ students.0.height }}</td>
<td>{{ students.0.sex }}</td>
</tr>
</table>
1.常用标签
{% load static%}
{% 标签%}{% 结束标签%}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-76nQz0G6-1575451227415)(assets\1568014263030.png)]
url的使用
<a href="{% url 'student:detail' student.name%}">{{ forloop.counter }}</a>
for循环的使用
{% for student in students %}
<tr>
<td><a href="{% url 'student:detail' student.name%}">{{ forloop.counter }}</a></td>
<td>{{ student.name }}</td>
<td>{{ student.age }}</td>
<td>{{ student.height }}</td>
<td>{{ student.sex }}</td>
</tr>
{% endfor %}
if语句的使用
{% if student.sex == '女' %}style="color: red" {% endif %}
with语句的使用
{% with stu_name=student.name %}
{% endwith %}
2.模板的继承和引用
- 引用include
Django模板通过模板标签实现一个模板,再其特点定的位置引入另一个模板
<div id="ad">
{% include 'student/ad.html' %}
</div>
3.继承extends+block
bootstarp
- 放在第一行
{% extends 'teacher/base.html' %}
-
block
-
{% block 名字 %} {% endblock %}
-
一个放在头部和尾部的中间部分
-
另一个放在需要放入的部分
<link href="{% static 'teacher/css/base.css' %}" rel="stylesheet">
{% block link %}
{% endblock %}
{% block link %}
<link rel="stylesheet" href="{% static 'student/css/index.css' %}">
{% endblock %}
8.自定义过滤器
1.设置数据是,通常并不会直接使用男女;而是使用数字来表示(女:0,男:1)
2.但是显示在页面上时,需要显示男和女
3.代码布局
-
某个app特有
-
根目录,多个app公用
常用设置是:设置app特有
步骤:
1.创建一个叫templatetags的包(‘init.py’)
2.app必须要在setting的INSTALL_APPS里配置好
3.重启服务
4.写自动以过滤器函数
def to_sex(value,arg='zh'):
change={
'zh':('女','男'),
'en':('Female','Male')
}
return change[arg][value]
5.注册
from django import template
register = template.Library()#变量名必须是register
def to_sex(value,arg='zh'):
change={
'zh':('女','男'),
'en':('Female','Male')
}
return change[arg][value]
register.filter('sex',to_sex)#前面可以取名字,
register.filter(to_sex)#如果不起名字,函数名就是过滤器名
注:因为使用的是元组,并且使用查找。所以在设置1和0的时候必须要将1和0设置为数字类型,如果为str类型,会报错。
6.在需要的地方把函数名进行过滤器的放置。因为有一个默认参数,如果需要改变这个默认参数,可以在函数名后面进行传值:to_sex:‘en’。
第二种:装饰器
from django import template
register = template.Library()#变量名必须是register
@register.filter(name='sex1')
def to_sex(value,arg='zh'):
change={
'zh':('女','男'),
'en':('Female','Male')
}
return change[arg][value]
9.自定义模板标签–可以干任何事情
在app内创建一个名字为templatetags的包
在INSTALLED_APPS里配置好路径
1.简单标签
{% url ‘app_name:name’ stu.name %}
1.创建函数
from datetime import datetime
def current_time(format_str):
now = datetime.now().strftime(format_str)
return now
2.导入
{% load customer_tags %}
3.注册
<p>我是通过自定义模板标签现实的时间:{% current_time '%Y年%m月%d日 %H:%M: %S'}</p>
3.使用
4.上下文管理
在视图函数里创建:
format_str = '%Y年%m月%d日 %H:%M: %S'
在函数里写:
@register.simple_tag(takes_context=True)#这个可以接受路由里的全部的值
def current_time(context):
return datetime.now().strftime(context['format_str'])
2.包含标签:一个模板通过渲染另一个模板来展示数据
前提:
-
表格内多行内容显示{{ student.course }}
-
通过for循环{% for course in student.course %}{{ course }}{% endfor %}
-
通过无序列表和for循环;
<td> <ul> {% for course in student.course %} <li>{{ course }}</li> {% endfor %} </ul> </td>
这个方法在很多地方都会用到,choices为需要迭代的对象
<ul>
{% for i in choices %}
<li>{{i}}</li>
{% endfor%}
</ul>
- 利用模板+自定义标签来实现
1.创建文件
def show_list_as_ul(value): #定义一个函数接受一个模板变量
return {'u_list':value} #'u_list'由模板决定
t = get_template('student/show_list_as_ul.html')#模板渲染
register.inclusion_tag(t)(show_list_as_ul)
2.注册
<td>{% show_list_as_ul student.course%}</td>
3.使用
4.优化
3简析:标签
对于简单标签,return什么东西就会在网页上显示什么。
对于包含标签,先接受变量,然后在register的模板里去渲染一遍然后return出来,
10.数据库的连接配置
db.sqlite3是django默认的数据库:有自己的一套语法
在项目中需要一套可伸缩的数据库。
python提供了api可以连接数据库
1.需要配置
1.数据接口
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
2.配置MySQL数据库:同数据库阶段
-
workon到相应的环境下安装pymysql(API)
-
创建数据库
-
root账户不允许远程登录,可以远程访问对的数据库用户
-
创建数据库
1.进入mysql的命令:mysql -uroot -pqwe123 2.展示所有的数据库:show databases; 3.创建数据库:create database CRM charset=utf-8;#指定字符编码格式 4.创建用户并且授权 grant all privileges on CRM.* to 'summer'@'%(允许远程)' identified by 'summer' 5.flush privileges;(刷新权限) 6.可以直接mysql -usummer -psummer -A CRM (直接进入库) 7.settings里修改配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'CRM',#数据库的名字 'USER':'summer', 'PASSWORD':'summer', 'HOST':'127.0.0.1', 'PORT':3306, } }
-
导入pymysql
在项目目录下有一个__init__文件
import pymysql pymysql.install_as_MySQLdb()
如果想获取更多有关python的信息,和想玩python制作的小程序,可以关注微信公众号(dreamspy)。我们一起用python改变世界,一起用python创造梦想。
-