<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 1. 首先建立Django項目 > Django是一款python的web開發框架 > 與MVC有所不同,屬于MVT框架 > m表示model,負責與數據庫交互 > v表示view,是核心,負責接收請求、獲取數據、返回結果 > t表示template,負責呈現內容到瀏覽器 * 數據庫是Django默認的sqlite3數據庫 1. 建立項目 > 1. pycharm > 【file】>【new project】>【Django】 > 2. 或者執行命令: >django-admin startproject test1 項目目錄如下 ![](https://box.kancloud.cn/d5bda5704f68b68bba09ef92a749e3f5_185x205.png) > 1. settings.py : > web項目中的整體配置 > 2. urls: > 通過正則匹配請求URL > 3. manage.py: > 一個命令行工具,可以使你用多種方式對Django項目進行交互 > 4. wsgi.py: > 項目與WSGI兼容的Web服務器入口 ## 2. 創建一個應用 ### 2.1 創建應用 #### 1. 直接用pycharm的命令行即可(直接在項目目錄下) ![](https://box.kancloud.cn/7e90ddae5de92be5a61c4a8a52ae0a04_462x74.png) #### 2. 執行建立應用命令 ~~~ python manage.py startapp booktest ~~~ 這時會在Django項目下出現我們剛才建立的應用 ![](https://box.kancloud.cn/f4979440047b8509c931963721cbb22a_212x299.png) 其中templates目錄是后邊自己建立的,用于web展示的HTML模板 #### 3. 注冊應用 激活模型:編輯settings.py文件,將booktest應用加入到installed_apps中,否則在數據庫遷移時,模型類不會起作用 ~~~ INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'booktest' # 新建的應用 ] ~~~ ### 2.2 models(數據庫交互) > Django是一個MVT框架,model是數據庫交互部分 #### 2.2.1 創建與數據庫映射的對象 > * 有一個數據表,就有一個模型類與之對應 > * 打開models.py文件,定義模型類 > * 引入包from django.db import models > * 模型類繼承自models.Model類 > * 說明:不需要定義主鍵列,在生成時會自動添加,并且值為自動增長 > * 當輸出對象時,會調用對象的str方法 1. 在新創建的應用booktest中的models.py文件中,創建映射對象 ~~~ from django.db import models class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateField() # 加方法不影響數據庫的映射 def __str__(self): return self.btitle class HeroInfo(models.Model): hname = models.CharField(max_length=10) hgender = models.BooleanField() hcontent= models.CharField(max_length=1000) hbook = models.ForeignKey(BookInfo) # 外鍵映射 def __str__(self): return self.hname ~~~ 2. 生成遷移文件:根據模型類生成sql語句 ~~~ python manage.py makemigrations ~~~ > 遷移文件被生成到應用的migrations目錄 ![](https://box.kancloud.cn/3d523f0f796634650266400354ac81b4_223x112.png) 3. 執行遷移:執行sql語句生成數據表 ~~~ python manage.py migrate ~~~ ![](https://box.kancloud.cn/b64151d36538deade3dbf4af5ab4f8d2_342x409.png) > 此時,根據我們定義的模型類,在數據庫生成了相應的兩張空表 * 此時可以用命令行的方式向數據庫插入數據 `python manage.py shell` 進入命令行 導包 ~~~ from booktest.models import BookInfo,HeroInfo from django.utils import timezone from datetime import * ~~~ > 1. 查詢所有圖書信息: `BookInfo.objects.all()` > 2. 新建圖書信息: ~~~ b = BookInfo() b.btitle="射雕英雄傳" b.bpub_date=datetime(year=1990,month=1,day=10) b.save() ~~~ > 3. 查找圖書信息: `b=BookInfo.objects.get(pk=1)` > 4. 輸出圖書信息: ~~~ b b.id b.btitle ~~~ > 5. 修改圖書信息: ~~~ b.btitle=u"天龍八部" b.save() ~~~ > 6. 刪除圖書信息: `b.delete()` > 7. 關聯對象的操作 > 對于HeroInfo可以按照上面的操作方式進行添加,注意添加關聯對象 ~~~ h=HeroInfo() h.htitle=u'郭靖' h.hgender=True h.hcontent=u'降龍十八掌' h.hBook=b h.save() ~~~ > 8. 獲得關聯集合:返回當前book對象的所有hero > b.heroinfo_set.all() > 9. 有一個HeroInfo存在,必須要有一個BookInfo對象,提供了創建關聯的數據: ~~~ h=b.heroinfo_set.create(htitle=u'黃蓉',hgender=False,hcontent=u'打狗棍法') h ~~~ 4. 運行應用 ~~~ python manage.py runserver ip:port # 指定IP和端口 python manage.py runserver port # 指定端口 ~~~ 或者 pycharm直接運行 ![](https://box.kancloud.cn/58f355d6c5065bf9caf3ed4942944098_790x181.png) #### 2.2.2.2 后臺管理 Django提供了對數據庫數據的web管理 1. 創建一個超級用戶 `python manage.py createsuperuser # 按提示輸入用戶名、郵箱、密碼` 2. 設置中國的時區 項目的settings文件 ~~~ LANGUAGE_CODE = 'zh-Hans' # 顯示漢語 TIME_ZONE = 'Asia/Shanghai' # 顯示中國時區 ~~~ 3. 登錄(用我們創建的用戶) ![](https://box.kancloud.cn/68a7d6565a492b34e31dbbe919ff8921_1311x645.png) * 自定義管理頁面 Django提供了admin.ModelAdmin類,通過定義ModelAdmin的子類,來定義模型在Admin界面的顯示方式 以下是自定義管理頁面的代碼 ~~~ from django.contrib import admin from booktest.models import * # Register your models here. # 注冊數據庫模型 """ 關聯添加(每插入一個book信息,附帶插入三個hero信息) 1. 定義類HeroInfoInline繼承admin.StackedInline model = HeroInfo 要附帶插入的類 extra = 3 附帶插入的數量 2. 在要插入的類BookInfoAdmin加入附帶類HeroInfoInline inlines = [HeroInfoInline] """ class HeroInfoInline(admin.StackedInline): model = HeroInfo extra = 3 # 自定義管理顯示字段 class BookInfoAdmin(admin.ModelAdmin): # 管理界面展示 list_display = ['pk','btitle','bpub_date'] # 字段過濾器 list_filter = ['btitle'] inlines = [HeroInfoInline] # 向管理頁面注冊模型類,并自定義顯示樣式 admin.site.register(BookInfo,BookInfoAdmin) admin.site.register(HeroInfo) ~~~ > 1. 列表頁屬性: > list_display:顯示字段(默認只顯示模型類的__str__的返回值),可以點擊列頭進行排序 > ~~~ list_display = ['pk', 'btitle', 'bpub_date'] ~~~ ![](https://box.kancloud.cn/fea08c9c84b083b9a1a8e58c0e379ef2_1635x193.png) > 2. list_filter:過濾字段,過濾框會出現在右側 ![](https://box.kancloud.cn/3aec87300b58ead75a154817bfd42880_1032x498.png) ~~~ list_filter = ['btitle'] search_fields:搜索字段,搜索框會出現在上側 search_fields = ['btitle'] ~~~ > 3. list_per_page:分頁,分頁框會出現在下側 list_per_page = 10 > 4. 添加、修改頁屬性 ~~~ fields:屬性的先后順序 fields = ['bpub_date', 'btitle'] fieldsets:屬性分組 fieldsets = [ ('basic',{'fields': ['btitle']}), ('more', {'fields': ['bpub_date']}), ] ~~~ > 5. 關聯對象 對于HeroInfo模型類,有兩種注冊方式 方式一:與BookInfo模型類相同 方式二:關聯注冊 按照BookInfor的注冊方式完成HeroInfo的注冊 接下來實現關聯注冊 #### 2.2.3 數據庫模型關系 > * 定義模型 > 1. 在模型(類)中定義屬性,會生成表中的字段 > * django根據屬性的類型確定以下信息: > 1. 當前選擇的數據庫支持字段的類型 > 2. 渲染管理表單時使用的默認html控件 > 3. 在管理站點最低限度的驗證 > 4. django會為表增加自動增長的主鍵列,每個模型只能有一個主鍵列,如果使用選項設置某屬性為主鍵列后,則django不會再生成默認的主鍵列 > 5. 屬性命名限制 > 6. 不能是python的保留關鍵字 > 7. 由于django的查詢方式,不允許使用連續的下劃線 > * 定義屬性 > 定義屬性時,需要字段類型 > 字段類型被定義在django.db.models.fields目錄下,為了方便使用,被導入到django.db.models中 > 使用方式 > 導入from django.db import models > 通過models.Field創建字段類型的對象,賦值給屬性 > 對于重要數據都做邏輯刪除,不做物理刪除,實現方法是定義isDelete屬性,類型為BooleanField,默認值為False > * 字段類型 > 1. AutoField:一個根據實際ID自動增長的IntegerField,通常不指定 > 2. 如果不指定,一個主鍵字段將自動添加到模型中 > 3. BooleanField:true/false 字段,此字段的默認表單控制是CheckboxInput > 4. NullBooleanField:支持null、true、false三種值 > 5. CharField(max_length=字符長度):字符串,默認的表單樣式是 TextInput > 6. TextField:大文本字段,一般超過4000使用,默認的表單控件是Textarea > 7. IntegerField:整數 > 8. DecimalField(max_digits=None, decimal_places=None):使用python的Decimal實例表示的十進制浮點數 > 9. DecimalField.max_digits:位數總數 > 10. DecimalField.decimal_places:小數點后的數字位數 > 11. FloatField:用Python的float實例來表示的浮點數 > 12. DateField[auto_now=False, auto_now_add=False]):使用Python的datetime.date實例表示的日期 > 13. 參數DateField.auto_now:每次保存對象時,自動設置該字段為當前時間,用于"最后一次修改"的時間戳,它總是使用當前日期,默認為false > 14. 參數DateField.auto_now_add:當對象第一次被創建時自動設置當前時間,用于創建的時間戳,它總是使用當前日期,默認為false > 15. 該字段默認對應的表單控件是一個TextInput. 在管理員站點添加了一個JavaScript寫的日歷控件,和一個“Today"的快捷按鈕,包含了一個額外的invalid_date錯誤消息鍵 > 16. auto_now_add, auto_now, and default 這些設置是相互排斥的,他們之間的任何組合將會發生錯誤的結果 > 17. TimeField:使用Python的datetime.time實例表示的時間,參數同DateField > 18. DateTimeField:使用Python的datetime.datetime實例表示的日期和時間,參數同DateField > 19. FileField:一個上傳文件的字段 > 20. ImageField:繼承了FileField的所有屬性和方法,但對上傳的對象進行校驗,確保它是個有效的image > * 字段選項 通過字段選項,可以實現對字段的約束,在字段對象時通過關鍵字參數指定 > 1. null:如果為True,Django 將空值以NULL 存儲到數據庫中,默認值是 False > 2. blank:如果為True,則該字段允許為空白,默認值是 False > 3. 對比:null是數據庫范疇的概念,blank是表單驗證證范疇的 > 4. db_column:字段的名稱,如果未指定,則使用屬性的名稱 > 5. db_index:若值為 True, 則在表中會為此字段創建索引 > 6. default:默認值 > 7. primary_key:若為 True, 則該字段會成為模型的主鍵字段 > 8. unique:如果為 True, 這個字段在表中必須有唯一值 > * 關系 > 1. ForeignKey:一對多,將字段定義在多的端中 > 2. ManyToManyField:多對多,將字段定義在兩端中 > 3. OneToOneField:一對一,將字段定義在任意一端中 > 4. 可以維護遞歸的關聯關系,使用'self'指定,詳見“自關聯” > 5. 用一訪問多:對象.模型類小寫_set ## 3. 視圖 > 在django中,視圖對WEB請求進行回應 > 視圖接收reqeust對象作為第一個參數,包含了請求的信息 > 視圖就是一個Python函數,被定義在views.py中 1. 新應用的views.py文件 ~~~ from django.http import * from django.shortcuts import render from django.template import RequestContext,loader from .models import * # django 的視圖就是函數 # 1. 配置settings模板路徑 'DIRS': [os.path.join(BASE_DIR, 'templates'),os.path.join(BASE_DIR,'booktest.templates')] # 配置urls路由 # template.render()將頁面渲染 def index(request): # 必須加一個參數 # template = loader.get_template("booktest/index.html") # return HttpResponse(template.render()) 這么寫麻煩 book_list = BookInfo.objects.all() # 通過模型類查詢到所有的數據 context = {'list':book_list} # 傳給模板 return render(request,"booktest/index.html",context) # 將數據傳遞給模板顯示 def show(request,id): books = BookInfo.objects.get(pk=id) hero_list = books.heroinfo_set.iterator() context = {'hero_list':hero_list} return render(request,'booktest/show.html',context) ~~~ * Django提供了函數Render()簡化視圖調用模板、構造上下文,就不用eturn HttpResponse(template.render()) 2. 配置URL路由(把請求路由到我們寫的方法) URLconf 在Django中,定義URLconf包括正則表達式、視圖兩部分 Django使用正則表達式匹配請求的URL,一旦匹配成功,則調用應用的視圖 注意:只匹配路徑部分,即除去域名、參數后的字符串 在test1/urls.py插入booktest,使主urlconf連接到booktest.urls模塊 url(r'^', include('booktest.urls')), * 在booktest中的urls.py中添加urlconf ~~~ from django.conf.urls import url from . import views urlpatterns = [ url(r'^index',views.index), # 交給views中的index方法處理 url(r'^(\d+)$',views.show) ] ~~~ * 在項目的URL路由中,添加我們應用的路由 * 這樣來自客戶端的請求就會路由到我們自定義的應用中去,并找到響應的處理辦法 ~~~ from django.conf.urls import url from django.contrib import admin from django.conf.urls import include urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^',include('booktest.urls')) # 把根請求后邊沒有東西的請求發送給booktest.urls路由 ] ~~~ ### 路徑 ![](https://box.kancloud.cn/9b5727b2a2fd27e37005d002141127c1_572x296.png) ## 4. HTML模板 可以接受views中處理請求的方法傳過來的值 > 1. 模板是html頁面,可以根據視圖中傳遞的數據填充值(手動創建) > 創建模板的目錄如下圖: ![](https://box.kancloud.cn/3943d1bbe200b1e091ee1dfbeab47aba_181x99.png) 2. 把定義的模板路徑,加入到項目當中去 修改settings.py文件,設置TEMPLATES的DIRS值 ~~~ 'DIRS': [os.path.join(BASE_DIR, 'templates'),os.path.join(BASE_DIR,'booktest.templates')] ~~~ 以下是兩個簡單的模板 index.html ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>index</title> </head> <body> <ul> {#執行python代碼,但是與python不同的是有for有結束#} {% for book in list%} <li> <a href="{{book.id}}">{{ book.btitle}}</a></li> {%endfor%} </ul> </body> </html> ~~~ {{book.id}} 取值,固定寫法 {% for 。。 %} 插入python代碼 show.html ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>show heroes</title> </head> <body> <ul> {%for hero in hero_list%} <li><h3>{{ hero.hname }}</h3></li> 簡介:{{ hero.hcontent }} {%endfor%} </ul> </body> </html> ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看