溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Day_19-Django(二)

發布時間:2020-03-20 18:36:05 來源:網絡 閱讀:584 作者:gao405208929 欄目:數據庫

本節內容概要:

一、路由系統URL

二、視圖

三、模板

四、ORM操作

問題1:Django請求生命周期

-> URL對應關系(匹配) -> 視圖函數 -> 返回用戶字符串
-> URL對應關系(匹配) -> 視圖函數 -> 打開一個HTML文件,讀取內容

問題2:創建Django project

django-admin  startproject xxx

cd xxx

python manage.py startapp CMDB


創建項目的所有步驟

1. 創建Django工程
            django-admin startproject 工程名

    2. 創建APP
        cd 工程名
        python manage.py startapp cmdb

    3、靜態文件
        project.settings.py
        
        STATICFILES_DIRS = (
            os.path.join(BASE_DIR, "static"),
        )
    
    4、模板路徑
    
        DIRS ==>    [os.path.join(BASE_DIR,'templates'),]
        
    5、settings中
        
        middlerware        
            # 注釋 csrf
            
            
    6、定義路由規則
        url.py        
            "login" --> 函數名
            
    7、定義視圖函數
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)   # 獲取請求發來的而數據
                
                # request.POST.get('',None)
                
                
                # return HttpResponse("字符串")
                # return render(request, "HTML模板的路徑")
                # return redirect('/只能填URL')
8、模板渲染
特殊的模板語言
-- {{ 變量名 }}

    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循環
    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>無年齡</a>
            {% endif %}
        </body>
    
    </html>


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

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

一、路由系統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

實戰:

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

     對URL路由關系進行命名, ***** 以后可以根據此名稱生成自己想要的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/

注:
# 當前的URL
request.path_info


多級路由

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),
    ]


 默認值

 

命名空間

 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時候,應該如下:

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

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

django中的路由系統和其他語言的框架有所不同,在django中每一個請求的url都要有一條路由映射,這樣才能將請求交給對一個的view中的函數去處理。其他大部分的Web框架則是對一類的url請求做一條路由映射,從而是路由系統變得簡潔。

通過反射機制,為django開發一套動態的路由系統Demo: 點擊下載

 

二、視圖

1、獲取用戶請求數據

request.GET
request.POST
request.FILES

PS:
GET:獲取數據
POST:提交數據
2、checkbox等多選的內容

request.POST.getlist()

3、上傳文件
# 上傳文件,form標簽做特殊設置

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 -> 函數名

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

====》
/index/ -> 函數名
/index/ -> 類
====》
建議:兩者都用

5、裝飾器


三、ORM

1.mysql和ORM對應示例

select * from tb where id > 1     # 對應關系models.tb.objects.filter(id__gt=1)
models.tb.objects.filter(id=1)
models.tb.objects.filter(id__lt=1)

1.根據類自動創建數據庫表

創建類

a. 先寫類

找到models.py:

from django.db import models

class UserInfo(models.Model):    # id列,自增,主鍵
    # 用戶名列,字符串類型,指定長度
    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',
]

 執行命令

python manage.py makemigrations 
python manage.py migrate


現在已經創建了一個表:app01_userinfo

提示:如果你不是用的默認數據庫那么你需要找到setting.py的DATABASE更改其內容

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


 # 由于Django內部連接MySQL時使用的是MySQLdb模塊,而python3中還無此模塊,所以需要使用pymysql來代替

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女