• Django基础(一)


     

    一.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 %}



  • 相关阅读:
    Markdown基本语法
    Linux之更好的使用Bash
    博客园-使用的模板
    井字棋的最优策略竟是先占角!
    Highcharts入门+Highcharts基础教程,【非常值得学习的资料】
    Python4周 入职培训的过程
    Linux系统入门学习:在CentOS上安装phpMyAdmin
    WeCenter程序安装
    js正则表达式语法
    Sublime text2如何设置快捷键让编写的HTML文件在浏览器预览?
  • 原文地址:https://www.cnblogs.com/shanghongyun/p/9826501.html
Copyright © 2020-2023  润新知