zoukankan      html  css  js  c++  java
  • Django基础2

    一.Django的路由层(URLconf)
    1.简单的路由配置
    urlpatterns = [
    url(r'^admin/$', admin.site.urls),
    # 在urls中用正则捕获待匹配的路径,直行第二项的视图函数,并在app01中的views中添加视图函数
    # def index(request):
    # return HttpResponse("ok")
    url(r'^index/$',views.index),
    ]
    2.无名分组
    (1)获取年份
    # 若要从URL 中捕获一个值,只需要在它周围放置一对圆括号。
    url(r'^year/(d{4})/$',views.year),#year_archive(request,2006)

    def year(request,year):
    date=datetime.datetime.now()
    return HttpResponse('year:%s' % (year))
    (2)获取年月
    url(r'^year/(d{4})/(d{2})/$',views.year_month),#year_month(request,2006,12)

    def year_month(request,year,mouth):
    date = datetime.datetime.now()
    return HttpResponse('year:%s mouth:%s' % (year,mouth))
    注:
    不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles。
    每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
    3.有名分组
    获取年月
    url(r'^year/(?P<year>d{4})/(?P<mouth>d{2})/$',views.year_month),#year_month(request,year=2006,mouth=12)

    def year_month(request,year,mouth):
    date = datetime.datetime.now()
    return HttpResponse('year:%s mouth:%s' % (year,mouth))
    给正则表达式中的每一个括号起一个名字,视图函数在使用时,
    只能使用该名字,视图函数的参数由位置参数变成了关键字参数
    4.分发
    项目的url中
    url(r'^app01/',include('app01.urls')),
    url(r'^app02/',include('app02.urls')),
    注:
    此时不要忘了引入include
    from django.conf.urls import include
    app01中
    from django.conf.urls import url,include
    from app01 import views
    urlpatterns=[
    url(r'^aaa/$',views.aaa),
    url(r'^bbb/$',views.bbb),
    ]
    app02中
    from django.conf.urls import url,include
    from app02 import views
    urlpatterns=[
    url(r'^ccc/$',views.ccc),
    url(r'^ddd/$',views.ddd),
    ]
    app01的views中
    def aaa(request):
    return HttpResponse('aaa')
    def bbb(request):
    return HttpResponse('bbb')
    app02的views中
    def ccc(request):
    return HttpResponse('ccc')
    def ddd(request):
    return HttpResponse('ddd')
    5.反向解析
    当程序进入aaa分支
    urlpatterns=[
    url(r'^aaa/$',views.aaa),
    url(r'^bbb/$',views.bbb,name='xxx'),
    ]
    进入aaa的视图函数
    def aaa(request):
    return render(request,'aaa.html')
    获取aaa.html页面
    表单提交到别名为xxx的地址中,返回上上层中,找到别名为xxx的地址,并进入
    <form action="{% url 'xxx' %}">
    <input type="text" name="content">
    <input type="submit">
    </form>
    进入bbb视图函数
    def bbb(request):
    return HttpResponse('bbb')
    注:反向解析的作用是,如果项目完成后,需要修改某个地址,只需要修改最初的一出,不用大量修改
    二.Django的视图层
    视图层:请求对象(request)和响应对象(HttpResponse)
    1.request属性
    def index(request):
    print(request.method) #请求方式 GET
    print(request.path) #请求路径 /index/
    print(request.POST) #post请求的数据 字典格式 <QueryDict: {}>
    print(request.GET) #get请求的数据 字典格式 <QueryDict: {}>
    print(request.META) #请求头 ...
    print(request.get_full_path()) #返回 path,如果可以将加上查询字符串。/index/
    print(request.is_ajax()) #如果请求是通过XMLHttpRequest 发起的,则返回True, False
    return HttpResponse('ok')
    2.HttpResponse对象
    (1)HttpResponse()
    括号中可以是一个普通字符串,也可以是一个标签字符串
    (2)render()
    a.读取文件字符串
    b.嵌入变量
    在要执行的视图函数中动态改变变量
    def index(request):
    apple = '苹果'
    return render(request,'start.html',{'apple':apple})
    在对应的HTML文件中动态渲染变量
    <body>
    <p>{{ apple }}</p>
    </body>
    (3)redirect()重定向
    在浏览器进入此地址时,让浏览器重新发一个请求,请求的地址时redirect返回的地址
    def cdx(request):
    return redirect('/index/')
    三.Django的模板层
    1.渲染变量{{ }}
    (1)深度查询
    当调用视图函数中的index方法时
    def index(request):
    import datetime
    name='shy'
    age=20
    hobby=['eat','drink']
    date=datetime.datetime.now()
    class Foo():
    def __init__(self,name,age):
    self.name=name
    self.age=age
    # 此时的方法只能是无参的方法
    def run(self):
    return 'running'
    a1=Foo('aaa',1)
    a2=Foo('bbb',2)
    a3=Foo('ccc',3)
    list=[a1,a2,a3]
    # locals()可代替传所有参数
    return render(request,'index.html',{'name':name,'age':age,'hobby':hobby,'date':date,'list':list})
    被盗调用的index.HTML
    <body>
    <p>{{ name }}</p>
    <p>{{ age }}</p>
    <p>{{ hobby.1}}</p>
    <p>{{ date }}</p>
    <p>{{ list.0.name }}</p>
    <p>{{ list.0.run }}</p>
    </body>
    (2)过滤器
    date:日期过滤器
    语法:{{ var|过滤器名字:参数 }}
    <p>{{ date|date:'Y:m:d' }}</p>
    作用:可以将日期转换成想要的格式

    default:如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值
    语法:{{ value|default:'默认值'}}
    <p>{{ list|default:'没有符合条件的书籍' }}</p>
    length:返回值的长度。它对字符串和列表都起作用
    语法:{{ value|length }}
    filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。
    语法:{{ value|filesizeformat }}
    slice:切割字符串
    语法:{{ value|slice:'1;3' }}
    truncatechars:如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾
    语法:{{ value|truncatechars:9 }}
    注:在给定的数目-3处阶段,留三个位置给...
    truncatewords :如果字符串字符多于指定的单词数量,那么会被截断
    语法:{{ value|truncatewords:9 }}
    safe
    Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。
    但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,
    后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,
    如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,
    如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:
    value="<a href="">点击</a>"
    {{ value|safe}}
    2.渲染标签{% %}
    for 标签
    {% for foo in list %}
    <p>{{ foo.age }}</p>
    {% endfor %}
    注:不能像python一样break

    forloop辅助功能
    forloop.counter 序号从1开始
    forloop.counter0 序号从0开始
    forloop.revcounter 序号倒序,最后一个是1
    forloop.revcounter0 序号倒序,最后一个是0
    forloop.first 判断是不是第一个
    forloop.last 判断是不是最后一个
    if标签
    {% if age > 18 %}
    <p>100</p>
    {% elif age <= 18 %}
    <p>{{ age }}</p>
    {% endif %}
    注:判断的符号两边要有空格

    with标签(相当于起了一个简短的名字,在小区域内可以使用别名)
    {% with list.0.name as a %}
    <p>{{ a }}</p>
    {% endwith %}

    csrf_token
    在form表单中的任意一个位置加一个{{ csrf_token }}即可解决form表单提交时的forbition
    实际上是偷偷加了一个
    <input type='hidden' name='scrfmiddlewaretoken' value='hhasgd7ew43jerf8efu'>
    做了一个通行证,用于拦截不通过get请求就发post请求的人

    3.模板继承 (extend)
    在视图函数中
    def index(request):
    return render(request,"index.html")

    def order(request):
    order_list=["订单1","订单2","订单3"]
    return render(request,"order.html",{"order_list":order_list})

    def shopping_list(request):
    shopping_list=["苹果","香蕉","苹果"]
    return render(request,"shopping_list.html",{"shopping_list":shopping_list})

    在母版中
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    <meta charset="UTF-8">
    {# block标签标示:子模版可能会覆盖掉模版中的这些位置。#}
    {% block title %}
    <title>Title</title>
    {% endblock %}
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    <style>
    *{
    margin: 0;
    padding: 0;
    }
    .header{
    100%;
    height: 50px;


    }
    </style>
    </head>
    <body>
    <div class="header"></div>

    <div class="container">
    <div class="row">
    <div class="col-md-3">
    {% block menu %}
    <div class="panel panel-success">
    <div class="panel-heading">Panel heading without title</div>
    <div class="panel-body">
    <p><a href="/index/">首页</a></p>
    <p><a href="/order/">订单</a></p>
    <p> <a href="/shopping_list/">商品列表</a></p>
    </div>
    </div>
    {% endblock %}
    </div>
    <div class="col-md-9">
    {% block content %}
    <h3>welcome!</h3>
    {% endblock content%}
    </div>
    </div>
    </div>
    </body>
    </html>
    在index页面中
    {#表示继承的模板,一定要写在以下内容的前面,否则会出错#}
    {% extends "base.html" %}

    {% block content %}
    super的意思是既显示母版的内容,又显示这个内容
    {{ block.super }}

    <div class="jumbotron">
    <h1>Hello, world!</h1>
    <p>...</p>
    <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
    </div>
    {% endblock %}

    {% block title %}
    <title>首页</title>
    {% endblock %}
    在order页面中
    {% extends "base.html" %}

    {% block content %}
    <h3>订单列表</h3>
    {% for order in order_list %}
    <p>{{ order }}</p>
    {% endfor %}
    {% endblock %}

    {% block title %}
    <title>订单</title>
    {% endblock %}
    在shopping_list页面中
    {% extends "base.html" %}

    每个模板都有自己的题目,所以顺序可以打乱
    {% block title %}
    <title>商品列表</title>
    {% endblock %}

    {% block content %}
    <h3>商品列表</h3>
    {% for foo in shopping_list %}
    <p>{{ foo }}</p>
    {% endfor %}
    {% endblock %}


  • 相关阅读:
    Java核心技术 卷一 笔记四 库类的直接使用
    Java核心技术 卷一 笔记三 大数值及数组
    Java核心技术 卷一 笔记2 字符串的复制
    Java核心技术 卷一 笔记1
    修改css 样式后, hover事件 不生效
    修改 element ui input 输入框 样式不生效问题
    css3 计算属性
    Vue3 改动系列
    浏览器实现,向下滑动 鼠标滚轮,页面横向移动
    linux ceont0s7 vue 打包压缩图片 一直报错
  • 原文地址:https://www.cnblogs.com/shanghongyun/p/9834877.html
Copyright © 2011-2022 走看看