草稿二

? for循环---表格
views def index(request):

context={ 'books':[ {'name':'xiyouji','author':'k','price':99}, {'name':'hongloumeng','author':'j','price':90}, {'name':'shuihuzhuan','author':'a','price':106}, {'name':'sanguoyanyi','author':'b','price':112}, ], 'person':{ 'username':'Jim Green', 'age':20, 'sex':'man' } } return render(request,'index.html',context=context)

html
......



# 表头
# 表格的基本格式就是这样




{% for book in books %} # 表身





{% endfor %}
bookname author price
{{ book.name }} {{ book.author }} {{ book.price }}


效果:
bookname author price
xiyouji k 99
hongloumeng j 90
shuihuzhuan a 106
sanguoyanyi b 112
? forloop.counter---返回数值(循环的次数,从1开始,只能用于for循环)
forloop.counter0---从0开始计数
forloop.recounter---counter的倒序(比如counter是1-4,那么recounter就是4-1)
forloop.recounter0---倒序末位数是0
示例:
html
......



# 添加计数






{% for book in books %}

# forloop.counter计数




{% endfor %}
number bookname author price
{{ forloop.counter }} {{ book.name }} {{ book.author }} {{ book.price }}


效果:
number bookname author price
1 xiyouji k 99
2 hongloumeng j 90
3 shuihuzhuan a 106
4 sanguoyanyi b 112
? forloop.first/last---对应 第一次/最后一次 循环
下述示例,对表格的第一行和最后一行渲染颜色:
{% for book in books %} {% if forloop.first %} # 第一次循环,渲染样式 {% elif forloop.last %} # 最后一次循环,渲染样式 {% else %} # 如果不是第一次/最后一次,那么就返回普通标签 {% endif %} # 这个结束标签不能遗漏 {% endfor %}
number bookname author price
{{ forloop.counter }} {{ book.name }} {{ book.author }} {{ book.price }}

看效果,成功渲染
? for...empty...示例:
views from django.shortcuts import render
from django.template.loader import render_to_string
from django.http import HttpResponse
def index(request):
context={ 'books':[ {'name':'sanguoyanyi','author':'shianang','price':100}, {'name':'shuihuzhuan','author':'luoguanz','price':120}, {'name':'hongloumeng','author':'caoxueqing','price':180}, {'name':'xiyouji','author':'wuchengen','price':200}, ], 'person':{ 'name':'Kate Green', 'age':18, 'sex':'woman', }, 'comments':[], # 这里只有为空,才会显示template的'There is no comment',值为None或者''都不行 } #return render(request,'index.html',context=dict(person=p)) return render(request,'index.html',context=context)

{% for comment in comments %}
{{ comment }}

{% empty %}
There is no any comment.

{% endfor %}
? with用法:定义模板变量
<1>基础用法示例:
views def index(request):
context={ ...... 'persons':[ 'Jim Green', 'Kate Green', 'Li Lei', 'Han meimei', ], } return render(request,'index.html',context=context)

html ......

【草稿二】{{ persons.0 }}
# 使用这种定义,显示'Jim Green'
{{ persons.0 }}

{{ persons.0 }}


现在换一种写法:

{% with name1=persons.0 %} # with相当于js的var,注意等号两边不能使用空格,否则语法错误
{{ name1 }}
# 显示'Jim Green'
{{ name1 }}

{{ name1 }}

{% endwith %}

<2>使用as命名变量:
上述示例稍微调整一下:

{% with persons.0 as name1 %}
{{ name1 }}
# 显示'Jim Green'
{{ name1 }}

{{ name1 }}

{% endwith %}

小结:具体使用哪种语法,看个人,我偏向于使用as;
使用with定义的变量,一旦范围超出'endwith',变量就失效了,这点要注意.
?spaceless标签:去除多余的空格,换行
示例:
{% spaceless %}百度链接
{% endspaceless %}

渲染后的效果(使用谷歌浏览器的'Sources'选项,而不是用'Elements'查看):
百度链接

● 自动转义:django默认自动转义
示例:
views def index(request):
context={ ...... 'info':"百度链接" # 注意这里的链接,只能用字符串来表示. } return render(request,'index.html',context=context)

html {{ info }} # 效果:百度链接
源码:百度链接 # 引号,破折号全被转义 现在,使用{% autoescape %}标签关闭/开启自动转义
html
{% autoescape off %} {{ info }} {% endautoescape %}

效果:成功实现链接的操作,而不会被转义成普通字符串.
? verbatim标签:包含在里面的'变量',不再表示'变量',它的作用就是可以和别的模板引擎混合使用
也就是说,可以把别的模板引擎语言,写在里面.
示例:
{% verbatim %} {{ var }} {% endverbatim %}

● url标签:反转网址,效果和view的reverse一样
示例:
html



Front index page - 锐客网

.nav{
overflow: hidden; #
    标签使用样式
    }
    .nav li{ #
  • 标签使用样式
    float: left;
    list-style: none;
    margin: 0 20px;
    }






    views def book(request):
    return HttpResponse('读书页')
    def movie(request):
    return HttpResponse('电影页')
    def city(request):
    return HttpResponse('同城页')
    urls from django.contrib import admin
    from django.urls import path
    from front import views
    urlpatterns = [
    path('admin/', admin.site.urls),
    path('',views.index),
    path('book/',views.book,name='book'),
    path('movie/',views.movie,name='movie'),
    path('city/',views.city,name='city'),
    ]
    启动服务,看看基本的效果,正常.
    现在修改html文档,添加标签链接:



    刷新一下,成功实现效果
    ? url标签接收url额外的参数示例:
    views ...
    def book_number(request,number):
    text='The number of book_id is {}'.format(number)
    return HttpResponse(text)
    urls ...
    path('book_detail/',views.book_number,name='book_number'),
    html


    刷新效果,网址成功跳转
    ? url 查询字符串拼接(和reverse类似,也是采用拼接的方式)
    示例:
    views def login(request):
    keyword=request.GET.get('next')
    if keyword:
    text='登陆后跳转的url是{}'.format(keyword)
    else:
    text='next为空'
    return HttpResponse(text)
    urls ......
    path('login/',views.login,name='login'),
    html


    访问:http://127.0.0.1:8000/,点击'登陆'
    跳转到:http://127.0.0.1:8000/login/?next= 网页显示'next为空'
    现在给next赋值:登陆
    跳转到:http://127.0.0.1:8000/login/?next=%E7%94%A8%E6%88%B7%E7%9A%84url,网页显示'登陆后跳转的url是用户的url'
    复习之前的reverse()手动拼接url def name(request):
    query_string=request.GET.get('name')
    if query_string:
    text='Your name is {}'.format(query_string)
    # 此时,若想获取当前url,只能手动拼接...
    local_url=reverse('name')+'?name={}'.format(query_string) # /name/?name=JimGreen
    print(local_url)
    else:
    text='Nothing'
    return HttpResponse(text)
    ● DTL过滤器(函数)
    ? add过滤器:对传进来的值,进行'相加'或'拼接'操作
    示例:
    views def index(request):
    context={
    'value':100 # 值为整型
    }
    return render(request,'index.html',context=context)
    html
    {{ value|add:200 }}
    # 结果为300

    源码:
    def add(value, arg): # 接收的第一个参数是value
    """Add the arg to the value."""
    try:
    return int(value) + int(arg) # 优先进行整型计算
    except (ValueError, TypeError):
    try:
    return value + arg # 否则就进行拼接
    except Exception: # 如果拼接不成功,就返回空字符串
    return ''
    ? cut过滤器:移除字符串中指定的值,类似于replace(args,' ')
    示例:
    views def index(request):
    context={
    'value':'Jim Green',
    }
    html
    {{ value|cut:' ' }}
    # JimGreen

    ? date过滤器:须传入datetime对象,再date转换成时间格式(具体的格式视需求而定)
    示例:
    views from django.http import HttpResponse
    from django.shortcuts import render
    import datetime
    def index(request):
    context={
    'today':datetime.datetime.now(),
    }
    return render(request,'index.html',context=context)
    HTML {{ today|date:'Y-m-d' }}
    # 2019-11-05
    注意:datetime对象的默认形式,类似下面这样的,显然,不是我们想要的格式,故可以使用data过滤器达到想要效果格式:
    from datetime import datetime
    now=datetime.now()
    now
    datetime.datetime(2019, 12, 19, 14, 14, 30, 490242) # 类元组的格式吧...
    date的其他参数,可以查阅官方文档进行修改
    ? default过滤器:若传入的value值为True,则返回该值,不做任何修改; 若值为False,则返回default传入的值
    示例:
    views def index(request):
    context={
    'value':'default值测试', # 若值为空list,则返回'计算为false'
    }
    html
    {{ value|default:'计算为false' }}
    #返回 default值测试

    default_if_none过滤器:仅仅只有值为None时,才渲染后面的值
    示例:
    views def index(request):
    context={
    'value':None,
    }
    return render(request,'index.html',context=context)
    html {{ value|default_if_none:'传入的值为None' }}
    # 结果为:传入的值为None
    ? first/last过滤器:返回list,tuple,str的第一个/最后一个元素
    示例:
    views def index(request):
    context={
    'value':['apple','pear','banana','noddle'],
    }
    return render(request,'index.html',context=context)
    html {{ value|last }}
    # noddle
    {{ value|first }}
    # apple
    ? 对浮点数的位数进行限制---floatformat过滤器
    示例:
    views def index(request):
    context={
    'value':63.8536,
    }
    return render(request,'index.html',context=context)
    html {{ value|floatformat }}
    # 63.9 不传参,默认只保留一个小数,四舍五入
    {{ value|floatformat:2 }}
    # 63.85 保留两位小数,四舍五入
    ? join过滤器---对 list,str,tuple的元素进行拼接
    示例:
    views def index(request):
    context={
    'value':[1,2,3,4]
    }
    return render(request,'index.html',context=context)
    html
    {{ value|join:'/' }}
    # 1/2/3/4

    ? length过滤器---返回list,str,tuple的的长度(从1开始)
    示例:
    views def index(request):
    context={
    'value':[1,2,3,4]
    }
    return render(request,'index.html',context=context)
    html
    {{ value|length }}
    # 4

    ? lower(小写)/upper(大写)
    示例:
    views def index(request):
    context={
    'value':'KING'
    }
    return render(request,'index.html',context=context)
    html
    {{ value|lower }}
    # king

    ? random过滤器:随机从list,tuple,str选择一个元素
    示例:
    views def index(request):
    context={
    'value':[1,2,3,4,5,6,7]
    }
    return render(request,'index.html',context=context)
    html
    {{ value|random }}
    # 随机出现一个数字

    ? safe---相当于{% autoescape off %}
    示例:
    views def index(request):
    context={
    'value':""
    }
    return render(request,'index.html',context=context)
    html
    {{ value|safe }}
    # 弹窗(说明js执行成功),这里若把safe省略,则会被自动转义成普通str

    ? slice---切片操作
    示例:
    views def index(request):
    context={
    'value':[1,2,3,4,5,6]
    }
    return render(request,'index.html',context=context)
    html
    {{ value|slice:"3:5" }}
    # [4,5] 切片从0开始

    ? striptags过滤器:去除value的html标签
    示例:
    views def index(request):
    context={
    'value':""
    }
    return render(request,'index.html',context=context)
    html
    {{ value|striptags }}
    # alert('Hello World')
    ? truncatechars过滤器:如果给定的字符串长度超过了过滤器指定的长度。那么会进行切割,并且拼接三个点来作为省略号
    注意:三个点也算在指定的长度里面,算三个字符
    示例:
    views def index(request):
    context={
    'value':"北京非常欢迎你"
    }
    return render(request,'index.html',context=context)
    html
    {{ value|truncatechars:"5" }}
    # 北京...
    '''
    解析:value长度为7,超过过滤器指定的长度5,触发切割,留3个字符给'.'号,所以只能分配两个字符给'北京'
    '''

    html
    {{ value|truncatechars:"8" }}
    # 北京非常欢迎你
    '''
    解析:value长度为7,没有超过过滤器指定的长度8,没有触发切割,所以原样返回'
    '''

    ? truncatechars_html过滤器:同理; 不同的地方,它不会计算html元素
    示例:
    views def index(request):
    context={ 'value':"北京非常欢迎你
    " } return render(request,'index.html',context=context)

    html
    {{ value|truncatechars_html:"5" }}
    # 北京...


    ● 自定义过滤器
    <1>新建app并install_app
    <2>app目录下,新建py包,并且一定命名为'templatetags'
    <3>新建filename.py文件(例如'my_filters.py')
    <4>导入注册模块,编写需要的功能
    示例:
    from django import template
    register=template.Library()
    '''
    a) 自定义的函数,最多只能有两个参数
    b) 第一个参数,永远是|左边的变量
    '''
    def join_together(value,word):
    return value+' '+word
    register.filter('join_together',join_together)
    另一种写法---装饰器修饰 from django import template
    register=template.Library()
    @register.filter('join_to') # 这里若不传过滤器名称,则默认以'函数名称'作为'过滤器名称'
    def join_together(value,word):
    return value+' '+word
    <5>view,html示例如下:
    views def index(request):
    context={
    'value':"Hello"
    }
    return render(request,'index.html',context=context)
    html {% load my_filter %} # 不能忘记加载刚才定义'my_filter.py'

    {{ value|join_together:'World' }}
    # Hello World

    ★ 实际需求功能:有一个这样的值
    时间1分钟以内---值就显示:刚刚
    1m 1h 1d x>30d---显示具体时间
    my_filters.py from django import template
    from datetime import datetime
    @register.filter()
    def time_since(value): # value表示过去的时间
    if not isinstance(value,datetime): # 对传入的值进行判断
    return value
    now=datetime.now() # 获取当前时间
    timestamp=(now-value).total_seconds() # 获取时间差,用总秒数表示
    if timestamp<60:
    return '刚刚'
    elif timestamp>=60 and timestamp<6060:
    time=int(timestamp/60)
    return '{} 分钟之前'.format(time)
    elif timestamp>=60
    60 and timestamp<606024:
    time=int(timestamp/60/60)
    return '{} 小时之前'.format(time)
    elif timestamp>=606024 and timestamp<606024*30:
    time=int(timestamp/60/60/24)
    return '{} 天之前'.format(time)
    else:
    return value.strftime("Y%-m%-d%-H%-M%") # 留意这种时间格式

      推荐阅读