day 69 MVC框架和MTV框架 模板 过滤器

Django之模板

目录Django模板系统

官方文档

常用语法

Django模板中只需要记两种特殊符号:

{{  }}和 {% %}

{{ }}表示变量,在模板渲染的时候替换成值,{% %}表示标签,表示逻辑相关的操作。

变量

{{ 变量名 }}

变量名由字母数字和下划线组成。

点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。

几个例子:

view中代码:

def template_test(request):
    l = [11, 22, 33]
    d = {"name": "alex"}

    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age

        def dream(self):
            return "{} is dream...".format(self.name)

    Alex = Person(name="Alex", age=34)
    Egon = Person(name="Egon", age=9000)
    Eva_J = Person(name="Eva_J", age=18)

    person_list = [Alex, Egon, Eva_J]
    return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})

模板中支持的写法:

复制代码
{# 取l中的第一个参数 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取对象的name属性 #}
{{ person_list.0.name }}
{# .操作只能调用不带参数的方法 #}
{{ person_list.0.dream }}
复制代码

注:当模板系统遇到一个(.)时,会按照如下的顺序去查询:

  1. 在字典中查询
  2. 属性或者方法
  3. 数字索引

 

Filters

翻译为过滤器,用来修改变量的显示结果。

语法: {{ value|filter_name:参数 }}

'|'左右没有空格没有空格没有空格

default :

{{ value|default:"nothing"}}

如果value值没传的话就显示nothing

注:TEMPLATES的OPTIONS可以增加一个选项:string_if_invalid:'找不到',可以替代default的的作用。

filesizeformat

将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。例如:

{{ value|filesizeformat }}

如果 value 是 123456789,输出将会是 117.7 MB。

add如果是数字就相加,字符串就拼接

给变量加参数

{{ value|add:"2" }}

value是数字4,则输出结果为6。

{{ first|add:second }}

如果first是 [1,.2,3] ,second是 [4,5,6] ,那输出结果是 [1,2,3,4,5,6] 。

lower

小写

{{ value|lower }}

upper

大写

{{ value|upper}}

title

标题(单词首字母大写)

{{ value|title }}

ljust

左对齐

"{{ value|ljust:"10" }}"

rjust

右对齐

"{{ value|rjust:"10" }}"

center

居中

"{{ value|center:"15" }}"

length

{{ value|length }}

返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.

slice  

切片

{{value|slice:"2:-1"}}

first

取第一个元素

{{ value|first }}

last

取最后一个元素

{{ value|last }}

join

使用字符串拼接列表。同python的str.join(list)。

{{ value|join:" // " }}

truncatechars

如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。

参数:截断的字符数

{{ value|truncatechars:9}}

date

日期格式化

{{ value|date:"Y-m-d H:i:s"}}

可格式化输出的字符:点击查看

safe

Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。

比如:

value = "<a href='#'>点我</a>"

{{ value|safe}}

自定义filter

自定义过滤器只是带有一个或两个参数的Python函数:

  • 变量(输入)的值 - -不一定是一个字符串
  • 参数的值 - 这可以有一个默认值,或完全省略

例如,在过滤器{{var | foo:“bar”}}中,过滤器foo将传递变量var和参数“bar”

自定义filter代码文件摆放位置:

app01/
    __init__.py
    models.py
    templatetags/  # 在app01下面新建一个package package
        __init__.py
        app01_filters.py  # 建一个存放自定义filter的py文件
    views.py

编写自定义filter

from django import template
register = template.Library()


@register.filter   #没有指定名字
def fill(value, arg):

    return "{} SB".format(value)



@register.filter(name="addSB")     #有指定名字
def add_sb(value):
    return "{} SB".format(value)

使用自定义filter

{# 先导入我们自定义filter那个文件 #}
{% load app01_filters %}

{# 使用我们自定义的filter #}
{{ somevariable|fill:"__" }}
{{ d.name|addSB }}

 

 总结:

创建过滤器的流程
1,在app01里创建templatetags文件夹
2,在templatetags里创建myfilters.py文件
3,在myfilters.py文件写入:
from django import template

register = template.Library()

@register.filter(name='dsd')
def add_sb(value,arg):
    return "{}_{}_sb".format(value,arg)

@register.filter
def add_sb(value,arg):
    return "{}_{}_sb".format(value,arg)
View Code

myfilters.py:

from django import template

register = template.Library()

@register.filter(name='dsd')
def add_sb(value,arg):
    return "{}_{}_sb".format(value,arg)

@register.filter
def add_sb(value,arg):
    return "{}_{}_sb".format(value,arg)
View Code

urls.py:

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^t_test',views.template_test)
]
View Code

views.py:

from django.shortcuts import render

# Create your views here.


def template_test(request):
    l = [11,22,33]
    d = {'name':'alex'}

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def sing(self):
        return '我们一起学猫叫,一起喵喵喵喵喵'
    def __str__(self):
        return '<Person object: {}>'.format(self.name)

    def __unicode__(self):
        return '<Person object: {}>'.format(self.name)

    __repr__ = __str__


def template_test(request):
     p1 = Person('张三','38')
     p2 = Person('李四','30')
     import datetime
     date_now = datetime.datetime.now()
     print(date_now.strftime('%Y-%m-%d %H:%M:%S'))
     return render(
         request,
         'template_test.html'
         ,{
           'name1':'alex',
             'age1':9000,
             'hobby_list':['抽烟','喝酒','烫头','美女'],
             'name_dict':{
                 'name1':'李1',
                 'name2':'李2',
                 'name3':'一二三四五六七',
             },
             'p1':p1,
             'p2':p2,
             'p_list':[p1,p2],


            # 过滤:filters
             'kong':{},

             #filesizeformat
             'file_size':1024,

             # add
             'add':'10',
             'list1':[1,2,3],
             'list2':[4,5,6],
             # upper lower title 小写 大写 单词首字母大写
             'string':'happy teachers day',
             # ljust 左对齐 rjust右对齐 center居中
             'long_string': "not work proor app(s):",
             # length
             'list':['a', 'b', 'c', 'd'],
             # slice切片:first获取第一个元素:last最后一个元素
             'listt': ['a', 'b', 'c', 'd','t','y','g'],
             #join拼接
             'date_now': 'datnow',
              # truncatechars截断#
             'lis':'fg fhfhfh hgfh gfhhdf',
             # safe弹出框
             # 'js': """<script>
             # for(var i=0;i<5;i++){
             #     alert('123')
             # }
             #  </script>""",
                 # date日期格式化#}
             'date1_now':date_now,

            }
     )
    
View Code

template_test.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#{{ name1 }}#}
{#{{ age1 }}#}
{#{{ hobby_list }}#}
{#{{ p1 }}#}
{#{{ p2 }}#}
{#<ul>#}
{#    {% for hobby in hobby_list %}#}
{#        <li>{{ hobby }}</li>#}
{#    {% endfor %}#}
{#</ul>#}
{#{{ hobby_list.0 }}#}
{#{{ hobby_list.1 }}#}
{##}
{##}
{##}
{#<hr>#}
{##取字典里的值#}
{#{{ name_dict.name1 }}#}
{#<hr>#}
{#{{ name_dict.name3 }}#}
{#<hr>#}
{#{{ name_dict.keys }}#}
{#<hr>#}
{#{{ name_dict.values }}#}
{#<hr>#}
{#{{ name_dict.items }}#}
{##}
{#<hr>#}
{#{% for key,value in name_dict.items %}#}
{#    {{ key }}:{{ value }}#}
{#{% endfor %}#}

<hr>
{{ p1.sing }}
<hr>
{{ p2.sing }}
<hr>
{{ p_list }}


<hr>
{{ p_list.0.name }}
{{ p_list.0.sing }}

<hr>
{##过滤器#}
filters
<p>{{ kong|default:'nothing' }}</p>
<p>{{ aaa|default:'nothing' }}</p>

{#filesizeformat#}
{{ file_size|filesizeformat }}

{#add#}
<hr>
{{ add|add:'10.2' }}
<hr>
{{ list1|add:list2 }}

{#lower upper title 小写 大写 单词首字母大写#}
{{ string|upper|lower|title }}
<hr>
{## ljust 左对齐 rjust右对齐 center居中#}
{#<p>{{ long_string|center:50 }}</p>#}
<p>{{ long_string|rjust:50 }}</p>
<hr>
{#length#}
{{ list|length }}
{#slice切片#}
<hr>
{{ listt|slice:'2:-1' }},
{#first取第一个元素#}
<hr>
{{ listt|first }}
<hr>
{#last取最后一个元素#}
{{ listt|last }}
<hr>
{#join拼接#}
{{ date_now|join:'*' }}
<hr>
{#truncatechars截断#}
{{lis|truncatechars:13 }}
hr
{#safe弹出框#}
{#{{ js }}#}

{#{{ js|safe }}#}

<hr>
{#date日期格式化#}
{{ date1_now|date:"Y-m-d H:i:s"}},


</body>
</html>
View Code
day69 
1. 内容回顾
    1. django的所有命令
        1. 安装django
            pip install django==1.11.15
        2. 创建项目
            django-admin startproject 项目名
        3. 启动项目
            cd 项目目录
            python manage.py runserver # 127.0.0.1:8000
            python manage.py runserver 80
            python manage.py runserver 0.0.0.0:80
        4. 创建APP
            python manage.py startapp app01
            注册APP
            'app01.apps.App01Config'
        5.     数据库迁移
            python manage.py makemigrations   # 检查models.py是否有变化,记录变化 app01/migrations
            python manage.py migrate          # 将变更记录同步到数据库中
    2. django的配置
        1. 注释csrf中间件   可以提交POST请求
        2. 数据库的配置
            ENGINE: mysql
            NAME:    数据库名字
            USER:    用户名
            PASSWORD:    密码
            HOST:     ip
            PORT:    3306
        3. 静态文件的配置
            STATIC_URL = '/static/'    # 别名
            STATICFILES_DIRS = [
                os.path.join(BASR_DIR,'static'),
                os.path.join(BASR_DIR,'static1'),
            ]
    
        4. TEMPLATES DIRS os.path.join(BASR_DIR,'templates')
        5. INSTALLED_APPS=[
            'app01',
            'app01.apps.App01Config'
        ]
    3. 对象和数据库的对应关系
        类   —— 》  数据表
        对象 —— 》  数据行
        属性 —— 》  字段
    4. django使用mysql数据库流程:
        1. 创建一个mysql数据库
        2. settings中写配置
            
            DATABASES = {
                'default': {
                    'ENGINE': 'django.db.backends.mysql',
                    'NAME': 'library',
                    'USER': 'root',
                    'PASSWORD': '',
                    'HOST': '127.0.0.1',
                    'PORT': 3306,
                }
            }
                
    
        3. 告诉django使用pymysql的模块连接mysql数据库
            在与settings同级的目录下的__init__.py中写代码:
            import pymysql
            pymysql.install_as_MySQLdb()
        4. 在app01/models.py中写类(继承models.Model)
            class Publisher(models.Model):
                id = models.AutoField(primary_key=True)
                name = models.CharField(max_length=32, unique=True)


            class Book(models.Model):
                id = models.AutoField(primary_key=True)
                title = models.CharField(max_length=32, unique=True)
                publisher = models.ForeignKey(to='Publisher', on_delete=models.CASCADE)

                def __repr__(self):
                    return "<Book object: {} >".format(self.title)


            class Author(models.Model):
                name = models.CharField(max_length=32, unique=True)
                books = models.ManyToManyField('Book')

                def __repr__(self):
                    return "<Author object: {} >".format(self.name)

                __str__ = __repr__

        5. 执行数据库迁移的命令
            python manage.py makemigrations
            python manage.py migrate
        
    
    5. ORM操作
        1. 查
            from app01 import models
            models.Publisher.objects.get(id=1,name='xx')   # 获取一个对象   —— 》一个对象
            models.Publisher.objects.all()            # 获取所有对象      ——》 queryset 对象列表
            models.Publisher.objects.filter(id=1,name='xx')  # 获取满足筛选条件的所有对象  ——》 queryset
            models.Publisher.objects.all().order_by('-id')  
            属性:
                pub_obj.id  
                pub_obj.name

                外键:    
                book_obj.id
                book_obj.title
                book_obj.publisher     ——》 书籍关联的出版社对象
                book_obj.publisher_id  ——》 书籍关联的出版社对象的id
                
                多对多:
                autho_obj.id
                autho_obj.name
                autho_obj.books        ——》管理对象
                autho_obj.books.all()  
            

        2. 增
            pub_obj = models.Publisher.objects.create(name='新的出版社名字')
            外键:
            
            models.Book.objects.create(title='新的书名',publisher=pub_obj)
            models.Book.objects.create(title='新的书名',publisher_id=pub_obj.id)
            
            多对多:
            autho_obj = models.Author.objects.create(name='作者名字')
            autho_obj.books.set([1,3,5])
            
        3.删
            models.Publisher.objects.get(id=1,name='xx').delete()
            
            models.Publisher.objects.all().delete() 
        4. 改
            
            pub_obj.name = '新的名字'
            pub_obj.save()
            
            book_obj.title = '新的书名'
            book_obj.publisher = pub_obj
            # book_obj.publisher_id = 1
            book_obj.save()
            
            
            autho_obj.name = '新的名字'
            autho_obj.save()
            autho_obj.books.set([1,2,3])
            
    6. request   ——》 封装请求的所有内容
        request.method    ——》 请求的方式   GET POST
        request.POST      ——》 post请求提交的数据   字典 request.POST['id']  request.POST.get('id',)
        request.GET       ——》 URL的参数
            127.0.0.1:80/del_book/?id=1&name=xxx
    7. 函数的返回值  
        HttpResponse('字符串')            ——》 页面显示字符串的内容
        render(request,'模板的名字',{k1:v1})        ——》 整个HTML文件返回给浏览器
        redirect('/index/')                跳转  重定向  响应头  location:/index/
    
    
内容回顾
fontawesome图库:http://www.fontawesome.com.cn/

 

 

posted on 2018-09-10 13:17  liangliang123456  阅读(268)  评论(0编辑  收藏  举报

导航