Day_19-Django(二)

本節(jié)內(nèi)容概要:

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶(hù)真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶(hù)帶來(lái)驚喜。創(chuàng)新互聯(lián)建站推出靖江免費(fèi)做網(wǎng)站回饋大家。

一、路由系統(tǒng)URL

二、視圖

三、模板

四、ORM操作

問(wèn)題1:Django請(qǐng)求生命周期

-> URL對(duì)應(yīng)關(guān)系(匹配) -> 視圖函數(shù) -> 返回用戶(hù)字符串
-> URL對(duì)應(yīng)關(guān)系(匹配) -> 視圖函數(shù) -> 打開(kāi)一個(gè)HTML文件,讀取內(nèi)容

問(wèn)題2:創(chuàng)建Django project

django-admin  startproject xxx

cd xxx

python manage.py startapp CMDB

創(chuàng)建項(xiàng)目的所有步驟

1. 創(chuàng)建Django工程
            django-admin startproject 工程名

    2. 創(chuàng)建APP
        cd 工程名
        python manage.py startapp cmdb

    3、靜態(tài)文件
        project.settings.py
        
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, "static"),
        )
    
    4、模板路徑
    
        DIRS ==>    [os.path.join(BASE_DIR,'templates'),]
        
    5、settings中
        
        middlerware        
            # 注釋 csrf
            
            
    6、定義路由規(guī)則
        url.py        
            "login" --> 函數(shù)名
            
    7、定義視圖函數(shù)
app下views.py

def func(request):                # request.method   GET / POST
                
                # http://127.0.0.1:8009/home?nid=123&name=alex
                # request.GET.get('',None)   # 獲取請(qǐng)求發(fā)來(lái)的而數(shù)據(jù)
                
                # request.POST.get('',None)
                
                
                # return HttpResponse("字符串")
                # return render(request, "HTML模板的路徑")
                # return redirect('/只能填URL')
8、模板渲染
特殊的模板語(yǔ)言
-- {{ 變量名 }}

    def func(request):
        return render(request, "index.html", {'current_user': "alex"})

        
    index.html
    
    <html>
    ..
        <body>
            <div>`current_user`</div>
        </body>
    
    </html>
    
    ====> 最后生成的字符串
    
    <html>
    ..
        <body>
            <div>alex</div>
        </body>
    
    </html>
-- For循環(huán)
    def func(request):
        return render(request, "index.html", {'current_user': "alex", 'user_list': ['alex','eric']})

        
    index.html
    
    <html>
    ..
        <body>
            <div>`current_user`</div>
            
            <ul>
                {% for row in user_list %}
                
                    {% if row == "alex" %}
                        <li>{{ row }}</li>
                    {% endif %}
                    
                {% endfor %}
            </ul>
            
        </body>
    
    </html>
    
#####索引################# 
    def func(request):
        return render(request, "index.html", {
                    'current_user': "alex", 
                    'user_list': ['alex','eric'], 
                    'user_dict': {'k1': 'v1', 'k2': 'v2'}})

        
    index.html
    
    <html>
    ..
        <body>
            <div>`current_user`</div>
            
            <a> {{ user_list.1 }} </a>
            <a> {{ user_dict.k1 }} </a>
            <a> {{ user_dict.k2 }} </a>
            
        </body>
    
    </html>

###### 條件

    def func(request):
        return render(request, "index.html", {
                    'current_user': "alex", 
                    "age": 18,
                    'user_list': ['alex','eric'], 
                    'user_dict': {'k1': 'v1', 'k2': 'v2'}})

        
    index.html
    
    <html>
    ..
        <body>
            <div>`current_user`</div>
            
            <a> {{ user_list.1 }} </a>
            <a> {{ user_dict.k1 }} </a>
            <a> {{ user_dict.k2 }} </a>
            
            {% if age %}
                <a>有年齡</a>
                {% if age > 16 %}
                    <a>老男人</a>
                {% else %}
                    <a>小鮮肉</a>
                {% endif %}
            {% else %}
                <a>無(wú)年齡</a>
            {% endif %}
        </body>
    
    </html>

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

一、路由系統(tǒng)URL

1.三種方式

1、url(r'^index/', views.index),    
     url(r'^home/', views.Home.as_view()),
2、url(r'^detail-(\d+).html', views.detail),  
3、url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)

 ps:

def detail(request, *args,**kwargs):
pass

實(shí)戰(zhàn):

1.url(r'^detail-(\d+)-(\d+).html', views.detail),

def func(request, nid, uid):                    
         pass
            
         def func(request, *args):
             args = (2,9)                    
         def func(request, *args, **kwargs):
             args = (2,9)

2.url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html', views.detail)

def func(request, nid, uid):    pass
    def funct(request, **kwargs):
    kwargs = {'nid': 1, 'uid': 3}    
def func(request, *args, **kwargs):
    args = (2,9)

 name

     對(duì)URL路由關(guān)系進(jìn)行命名, ***** 以后可以根據(jù)此名稱(chēng)生成自己想要的URL *****

url(r'^asdfasdfasdf/', views.index, name='i1'),
url(r'^yug/(\d+)/(\d+)/', views.index, name='i2'),
url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='i3'),
def func(request, *args, **kwargs):    from django.urls import reverse
    
    url1 = reverse('i1')                              # asdfasdfasdf/
    url2 = reverse('i2', args=(1,2,))                 # yug/1/2/
    url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # buy/1/9/

    
xxx.html
    
    {% url "i1" %}               # asdfasdfasdf/
    {% url "i2" 1 2 %}           # yug/1/2/
    {% url "i3" pid=1 nid=9 %}   # buy/1/9/

注:
# 當(dāng)前的URL
request.path_info


多級(jí)路由

project/urls.py
    from django.conf.urls import url,include
    from django.contrib import admin

    urlpatterns = [
        url(r'^cmdb/', include("app01.urls")),
        url(r'^monitor/', include("app02.urls")),
    ]
    
app01/urls.py
    from django.conf.urls import url,include
    from django.contrib import admin
    from app01 import views

    urlpatterns = [
        url(r'^login/', views.login),
    ]
    
app02/urls.py
    from django.conf.urls import url,include
    from django.contrib import admin
    from app02 import views

    urlpatterns = [
        url(r'^login/', views.login),
    ]

 默認(rèn)值

 

命名空間

 a. project.urls.py

from django.conf.urls import url,include
 
urlpatterns = [
    url(r'^a/', include('app01.urls', namespace='author-polls')),
    url(r'^b/', include('app01.urls', namespace='publisher-polls')),
]

b. app01.urls.py

from django.conf.urls import url
from app01 import views
 
app_name = 'app01'urlpatterns = [
    url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
]

c. app01.views.py

def detail(request, pk):
    print(request.resolver_match)
    return HttpResponse(pk)

以上定義帶命名空間的url之后,使用name生成URL時(shí)候,應(yīng)該如下:

  • v = reverse('app01:detail', kwargs={'pk':11})

  • {% url 'app01:detail' pk=12 pp=99 %}

django中的路由系統(tǒng)和其他語(yǔ)言的框架有所不同,在django中每一個(gè)請(qǐng)求的url都要有一條路由映射,這樣才能將請(qǐng)求交給對(duì)一個(gè)的view中的函數(shù)去處理。其他大部分的Web框架則是對(duì)一類(lèi)的url請(qǐng)求做一條路由映射,從而是路由系統(tǒng)變得簡(jiǎn)潔。

通過(guò)反射機(jī)制,為django開(kāi)發(fā)一套動(dòng)態(tài)的路由系統(tǒng)Demo: 點(diǎn)擊下載

 

二、視圖

1、獲取用戶(hù)請(qǐng)求數(shù)據(jù)

request.GET
request.POST
request.FILES

PS:
GET:獲取數(shù)據(jù)
POST:提交數(shù)據(jù)
2、checkbox等多選的內(nèi)容

request.POST.getlist()

3、上傳文件
# 上傳文件,form標(biāo)簽做特殊設(shè)置

obj = request.FILES.get('fafafa')
obj.name
f = open(obj.name, mode='wb')for item in obj.chunks():
f.write(item)
f.close()

4、FBV & CBV
  function base view

url.py
index -> 函數(shù)名

view.py
def 函數(shù)(request):
...

====》
/index/ -> 函數(shù)名
/index/ -> 類(lèi)
====》
建議:兩者都用

5、裝飾器

三、ORM

1.MySQL和ORM對(duì)應(yīng)示例

select * from tb where id > 1     # 對(duì)應(yīng)關(guān)系models.tb.objects.filter(id__gt=1)
models.tb.objects.filter(id=1)
models.tb.objects.filter(id__lt=1)

1.根據(jù)類(lèi)自動(dòng)創(chuàng)建數(shù)據(jù)庫(kù)表

創(chuàng)建類(lèi)

a. 先寫(xiě)類(lèi)

找到models.py:

from django.db import models

class UserInfo(models.Model):    # id列,自增,主鍵
    # 用戶(hù)名列,字符串類(lèi)型,指定長(zhǎng)度
    username = models.CharField(max_length=32)
    password = models.CharField(max_length=64)

 找到如下添加最后一行:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01',
]

 執(zhí)行命令

python manage.py makemigrations 
python manage.py migrate

現(xiàn)在已經(jīng)創(chuàng)建了一個(gè)表:app01_userinfo

提示:如果你不是用的默認(rèn)數(shù)據(jù)庫(kù)那么你需要找到setting.py的DATABASE更改其內(nèi)容

DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME':'dbname',
    'USER': 'root',
    'PASSWORD': 'xxx',
    'HOST': '',
    'PORT': '',
    }
}

 # 由于Django內(nèi)部連接MySQL時(shí)使用的是MySQLdb模塊,而python3中還無(wú)此模塊,所以需要使用pymysql來(lái)代替

Django默認(rèn)使用MySQLdb模塊鏈接MySQL
主動(dòng)修改為pymysql,在project同名文件夾下的__init__文件中添加如下代碼即可:

網(wǎng)頁(yè)名稱(chēng):Day_19-Django(二)
標(biāo)題鏈接:http://bm7419.com/article6/jjegig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、響應(yīng)式網(wǎng)站App設(shè)計(jì)、靜態(tài)網(wǎng)站、網(wǎng)站改版、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)