django框架(3)

十二、模板变量和路径映射

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.静态页面、动态页面

扫描二维码关注公众号,回复: 8723149 查看本文章

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创造梦想。
    在这里插入图片描述

发布了43 篇原创文章 · 获赞 11 · 访问量 5404

猜你喜欢

转载自blog.csdn.net/jiangSummer/article/details/103390598