Django-基礎-1

BigBao的部落格發表於2018-08-24
Django 的學習
https://www.cnblogs.com/yuanchenqi/articles/8875659.html
https://www.cnblogs.com/yuanchenqi/articles/7629939.html
http://www.cnblogs.com/haiyan123/p/7701412.html

MTV 模型
    M  model      (負責業務物件和資料庫的關係對映)(orm)
    T  template   (存放html,負責把頁面展示給使用者)
    V  view          (檢視,負責業務邏輯,在適當的時候呼叫model和template)
    Django 有一個URL控制器(路徑和函式關係的對映,pattern),根據URL  pattern  來分發給不同的view函式處理,view呼叫相應的model和template 返回頁面給使用者
一般是使用者通過瀏覽器向我們的伺服器發起一個請求(request),這個請求回去訪問檢視函式,(如果不涉及到資料呼叫,那麼這個時候檢視函式返回一個模板也就是一個網頁給使用者),檢視函式呼叫模型,模型去資料庫查詢資料,然後逐級返回,檢視函式把返回的資料填充到模板中空格中,最後返回網頁給使用者。

django  的安裝
pip3 install django(目前最新版本是2.0)
我們上課的時候用的是1.x版本,所以這裡我也裝1.11版本的
pip3 install django==1.11
django 是下載在python3 直譯器的lib 目錄下面了
下載完成後會看到我們的scripts 多了django-admin.exe   django-admin.py

使用django-admin.py startproject myproject 建立專案
使用cd myproject && python3 manage.py startapp app01 建立應用
我們使用命令列或者是pycharm 建立一個專案,專案名是Myproject,然後我們再建立一個應用的名字app01
建立完成之後的目錄結構是這樣的

myproject-------------------------->這個是專案名,可以更改
    app01-------------------------->專案應用的名稱,我們要是有多個應用這裡我們還可以有app02,app03
        migrations
            __init__.py
            admin.py
            models.py
            tests.py
            views.py
    myproject----------------------->這個名字不可更改,這裡的配置是應用於全域性配置的
        __init__.py
        settings.py----------------->存放專案的配置檔案
        urls.py--------------------->路徑和檢視函式的對映關係,看urlpatterns字典,當應用很多的時候,我們應該在每個應用裡面建立一個urls.py
        wsgi.py--------------------->和socket相關
    templates----------------------->存放各種html檔案,css,js 會放在新的static資料夾
    manage.py----------------------->與Django專案進行互動的指令碼,啟動的時候我們執行python manage.py runnserver IP PORT,預設8000埠

這裡我們分不同的應用是為了解耦
url 匹配規則自上而下。上面匹配上了,不再往下匹配

HttpResponse :封裝響應體的類,返回任何資料,都應該放在HttpResponse裡返回

這裡舉例我們的url 路徑是timer  那麼就會匹配上這一條規則 url(r'^timer/', views.timer),就去執行
檢視函式中的timer(形參xxx)函式,傳入一個request 實參,request 包含所有的請求資訊,當我們請求的時候
Django中的wsgi把所有的請求資訊封裝成request物件,封裝好之後立馬傳給timer,timer 函式要是利用任何一個
request 的任意一個物件資訊的時候直接從request物件裡取就可以了

render : render(request, template_name[, context])
    結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 物件。
    按照settings配置指定的路徑找到html 檔案
引數:
     request: 用於生成響應的請求物件。
     template_name:要使用的模板的完整名稱,可選的引數,這裡我們直接templates目錄下的html檔名即可,因為在setting.py 中 TEMPLATES 列表配置了templates的環境變數,'DIRS': [os.path.join(BASE_DIR,'templates')]
     context:新增到模板上下文的一個字典。預設是一個空字典。如果字典中的某個值是可呼叫的,檢視將在渲染模板之前呼叫它。
     content_type:生成的文件要使用的MIME型別。預設為DEFAULT_CONTENT_TYPE 設定的值。
     status:響應的狀態碼。預設為200。
     render 其實最終也是呼叫的HttpResponse

    ctime = str(time.time())
    name = 'bigbao'
    age = '18'
    return render(request,"time.html",{'ctime':ctime,'name':name,'age':age})
    這裡的“ctime” key 是html模板中要引用的,ctime是上面函式取到的

模板語法: 目的是將變數(資料庫的內容)如何巧妙的嵌入到html頁面中(就不用之前我們用的字串拼接了)
在 Django 模板中遍歷複雜資料結構的關鍵是句點字元,語法:
{{var_name}}   

render 方法有兩個功能:
                    返回一個頁面
                    模板語法:將變數巧妙的嵌入html頁面中
return HttpResponse("訪問成功") 返回的一定是一個字串,如果想返回純字串,就用HttpResponse方法


我們在post資料的時候我們可以再request.POST 物件裡面取到我們提交的資料
比如說我們在form表單裡提交了我們input裡定義的兩個input元素名稱 user_name 和 pwd,那麼我們就可以再request.post.get('user_name')
和request.post.get('pwd') 取到相應的值



URL控制器
    url組成部分:
        協議://ip(域名):埠/路徑?引數
    url的功能: url路徑和檢視函式的對映關係
    1、一旦匹配成功則不再繼續
    2、若要從URL 中捕獲一個值,只需要在它周圍放置一對圓括號。url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),

    # 無名分組:
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive)  給函式傳入兩個實參

    # 有名分組(就是給分組起個名字,這樣定義的好處就是按照關鍵字引數去傳參了,指名道姓的方式)語法:(?P<name>pattern)
    url(r'^article/(?P<year>\d{4})/(?P<month>\d{2})$', views.year_month_hasname),這樣函式year_month_hasname裡會有兩個形參的名字是year和moth和位置無關


    URL 分發:
        這裡我們應該解耦,我們可以把每個URL pattern 放在自己的應用下面,在我們自己的應用下面建立一個urls.py檔案
        全域性配置的urls.py 需要配置如下
        from django.conf.urls import url,include
        url(r'^app01/', include('app01.urls'))    也就是說訪問路徑以app01 開頭的路徑都到app01 下面的的urls去匹配規則

    URL 反射:我們把我們的url路徑加上一個別名,然後直接呼叫別名路徑,這樣我們以後修改URL路徑的時候別名不改,改動就小了,不然的話改動太大
        url(r'^login/',name=xxxxx),這樣我們以後修改url 的時候,這裡我們以後修改路徑的時候我們直接修改成如下:
        url(r'^login.hhhtml/',name=xxxxx)   反向解析
        
        這樣我們在模板語法中標籤怎麼呼叫這個變數呢,
        <form action="{% url 'xxxxx' %}" method="post"> 我們就會跳到login.hhhtml/頁面了,我們不需要修改其他的東西
        這裡我們去找別名是 xxxxx 的URL,然後我們找到的是   login.hhhtml ,然後把login.hhhtml/ 放到action裡面,把{% url 'xxxxx' %} 換成  login.hhhtml/



檢視函式
    1 request 物件
        request.GET 
        request.POST
        request.method
        request.path
        request.get_full_path()

    2 HttpResponse
        Django 必須相應HttpResponse 物件
        HttpResponse  用來相應字串
        render           用來響應模板
        redirect      重定向 from django.shortcuts import render,HttpResponse,redirect
        比如說我們登入成功之後給我們重定向到首頁
        return redirect('/index/')


模板語法  http://www.cnblogs.com/haiyan123/p/7725568.html
    變數渲染{{ }}
        深度查詢:
            說到底就是利用句點符來操作
            傳入列表的時候,我們html 中變數引用的時候用{{ list.3 }}
            傳入字典的時候,html 模板語法中用  {{ dict.key }}

        過濾器:
            語法: {{obj|filter__name:param}}
            default 過濾器:
            date 過濾器:{{ value|date:"Y-m-d" }}  
            length 過濾器:{{ value|length }}
            filesizeformat 過濾器:{{ value|filesizeformat }}
            slice 過濾器:{{ value|slice:"2:-1" }}
            truncatechars 過濾器:{{ content|truncatechars:20 }}

    標籤渲染{ %% }
        for 迴圈標籤  我麼可以用到{{ forloop.counter }} 來新增數字,需在for迴圈內用,我們要是迴圈字典我們可以利用dict.items
            <ul>
                {% for book in book_list %}
                    <li>{{ book }}</li>
                {% endfor %}
            </ul>

        if 標籤
        {% for foo in score %}
            {% if foo > 100 %}
                <p> {{ foo }}</p>
            {% endif %}
        {% endfor %}

靜態檔案的引入:
# 別名,以後實際用的時候用的是這個別名,STATICFILES_DIRS 是Django用的,STATICFILES_DIRS 和 STATIC_URL 必須都存在,結合使用的
# 我們在用STATIC_URL別名的時候,Django 會自己去找到他的實際路徑,我們在html應用靜態檔案的時候必須用別名,比如
# <script src="/static/jquery.js"></script>   這個就是我靜態檔案應用的格式
# 下面這個兩個是在setting.py 檔案裡面配置的
STATIC_URL = '/static/'

# 檔案的實際存在目錄,必須叫STATICFILES_DIRS
STATICFILES_DIRS=[os.path.join(BASE_DIR,"static")]



模板的繼承
我們寫一個繼承模板base.html
    繼承模板裡的
    {% block content %}
        繼承模板的內容
    {% endblock content %}


    然後我們在我們的子模板裡,首行加上{% extends 'base.html' %}
    然後在html 檔案中寫入

    {% block content %}
        自己的獨特內容,這種情況下會覆蓋父模板的內容,我麼可以加上{{ block.super }},父模板的內容在子模板也出現
    {% endblock content %}



ORM
http://www.cnblogs.com/yuanchenqi/articles/8933283.html

有幾個問題:
    1、python3 我們用的資料庫連結用的是pymysql,所以這裡我們在全域性的__init__.py 檔案或者是工程的__init__.py 檔案加上如下兩句話
        import pymysql
        pymysql.install_as_MySQLdb()
    2、然後把配置檔案setting.py 中的DATABASES 的sqlite3 換成mysql
        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',
                'NAME':'orm',# 要連線的資料庫,連線前需要建立好
                'USER':'root',# 連線資料庫的使用者名稱
                'PASSWORD':'abcd1234',# 連線資料庫的密碼
                'HOST':'10.10.20.17',# 連線主機,預設本級
                'PORT': 3306 #  埠 預設3306
            }
        }
    3、models.py 中 建立 表的類    
        class Book(models.Model):
            id = models.AutoField(primary_key=True)
            title = models.CharField(max_length=32)
            state = models.BooleanField()
            pub_date = models.DateField()
            price = models.DecimalField(max_digits=8, decimal_places=2)
            publish = models.CharField(max_length=32)    

    4、初始化資料庫
        python manage.py makemigrations  (這一步就報錯了)
        python manage.py migrate
        在執行初始化資料庫的時候遇到
        No changes detected
        然後按照網上的方法,python manage.py makemigrations app01 ,同時在setting.py 裡的INSTALLED_APPS新增一行'app01'
        然後再去刪除相應的快取,再執行
        python manage.py makemigrations app01
        python manage.py migrate