日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django入门(二) 理解Django生命流程周期

發布時間:2024/9/3 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django入门(二) 理解Django生命流程周期 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接上篇:Django入門-項目創建與初識子應用

項目的數據庫模型

這里我們先使用sqlite類型的數據庫,后面在進行改變

創建數據庫模型

名詞:
ORM(Object Ralational Mapping,對象關系映射)用來把對象模型表示的對象映射到基于S Q L 的關系模型數據庫結構中去。
這樣,我們在具體的操作實體對象的時候,就不需要再去和復雜的 SQ L 語句打交道,只需簡單的操作實體對象的屬性和方法。
一對多關系:外鍵寫在多的一端
book:hero = 1:n

本示例完成“圖書-英雄”信息的維護,需要存儲兩種數據:圖書、英雄
圖書表結構設計: 表名: Book
圖書名稱: title
圖書發布時間: pub_date
英雄表結構設計: 表名: Hero
英雄姓名: name
英雄性別: gender
英雄簡介: hcontent
所屬圖書: hbook
圖書-英雄的關系為一對多

# bookApp/models.py from django.db import models """ 名詞: ORM(Object Ralational Mapping,對象關系映射)用來把對象模型表示的對象映射到基于S Q L 的關系模型數據庫結構中去。這樣,我們在具體的操作實體對象的時候,就不需要再去和復雜的 SQ L 語句打交道,只需簡單的操作實體對象的屬性和方法。 一對多關系:外鍵寫在多的一端 book:hero = 1:n """ # Create your models here. # 類對應數據庫表, 表名稱默認為bookApp_book. class Book(models.Model):# 屬性對應數據庫表的列名,默認會添加id這一列。name = models.CharField(max_length=40, verbose_name="書籍名稱")pub_date = models.DateField(verbose_name="出版日期")# 魔術方法,字符串友好展示, 便于調試代碼def __str__(self):return self.nameclass Meta:# 單數時顯示的名稱verbose_name = "圖書管理"# 復數時顯示的名稱verbose_name_plural = verbose_name""" 更多查詢操作請參考網址: https://docs.djangoproject.com/zh-hans/3.1/topics/db/queries/ """ # 類對應數據庫表, 表名稱默認為bookApp_hero. class Hero(models.Model):# 屬性對應數據庫表的列名,默認會添加id這一列。gender_choice = [(1, "男"),(2, "女")]name = models.CharField(max_length=20, verbose_name="人物名稱")# 性別只能選擇男(1)或者女(2)gender = models.IntegerField(choices=gender_choice, verbose_name="性別") # 1, 2content = models.TextField(max_length=1000, verbose_name="人物描述")# 外鍵關聯, 如果刪除書籍時,相關hero對應的書籍設置為空。book_id = models.ForeignKey(Book, on_delete=models.SET_NULL,null=True, verbose_name="書籍id")def __str__(self):return self.name# Meta選項的更多使用請參考網址: https://docs.djangoproject.com/zh-hans/3.1/ref/models/options/class Meta:# 單數時顯示的名稱verbose_name = "人物管理"# 復數時顯示的名稱verbose_name_plural = verbose_name

生成數據庫表

激活模型:編輯 settings.py 文件,將應用加入到 INSTALLED_APPS 中

生成遷移文件

python manage.py makemigrations

執行遷移:

python manage.py migrate

在數據庫中查看表信息

數據庫模型基本操作

  • 現在進入交互式的Python shell,并使用 Django 提供的免費 API
python manage.py shell
  • 引入需要的包:
from bookApp.models import Hero, Book
  • 查詢所有圖書信息:
Book.objects.all()
  • 新建圖書信息:
>>> from datetime import date >>> b1 = Book() >>> b1.name = "西游記" >>> d1 = date(2000,1,1) >>> b1.pub_date = d1 >>> b1.save() >>> Book.objects.all()

  • 增加書籍信息
>>> b2 = Book(name="紅樓夢",pub_date=date(1784, 2, 1)) >>> b2.save() >>> Book.objects.all() <QuerySet [<Book: 西游記>, <Book: 紅樓夢>]>
  • 查找圖書信息:
>>> b1 = Book.objects.filter(name="西游記").first() >>> b1 <Book: 西游記> >>> b1.pub_date datetime.date(2000, 1, 1)
  • 刪除圖書信息:
>>> b1.delete()
  • 添加關聯對象
>>> # 書籍的創建 >>> book = Book(name="倚天屠龍記",pub_date=date(2000,1,1)) >>> book.save() >>> # 人物的創建 >>> hero1 = Hero(name="周芷若", gender=2,content="info....") >>> hero1.save() >>> hero1.book_id = book >>> hero1.book_id <Book: 倚天屠龍記>
  • 獲得關聯集合:返回當前book對象的所有hero
book.hero_set.all()
  • 篩選
>>> books = Book.objects.filter(name__contains="紅") >>> books <QuerySet [<Book: 紅樓夢>]>

自定義模型加入后臺管理

打開 bookApp/admin.py 文件,注冊模型

from django.contrib import admin from bookApp.models import Book,Hero # 自定義后臺站點管理的拓展閱讀: https://docs.djangoproject.com/zh-hans/3.1/ref/contrib/admin/ # Register your models here. admin.site.register([Book,Hero])

  • 刷新管理頁面,可以對 Book 的數據進行增刪改查操作 ;
  • 后臺管理時, Book管理顯示的是英文, 如何變成中文?

# bookApp/models.pyclass Meta:# 單數時顯示的名稱verbose_name = "圖書管理"# 復數時顯示的名稱verbose_name_plural = verbose_name

效果:

自定義管理頁面

  • Django 提供了 admin.ModelAdmin 類
  • 通過定義 ModelAdmin 的子類,來定義模型在 Admin 界面的顯示方式
from django.contrib import admin from bookApp.models import Book,Hero # 自定義后臺站點管理的拓展閱讀: https://docs.djangoproject.com/zh-hans/3.1/ref/contrib/admin/ # Register your models here. class HeroInline(admin.StackedInline):model = Heroextra = 3class BookAdmin(admin.ModelAdmin):# 列表頁展示的設置list_display = ['id', 'name', 'pub_date']list_filter = ['pub_date']search_fields = ['name']list_display_links = ['name']list_per_page = 5inlines = [HeroInline]class HeroAdmin(admin.ModelAdmin):# 列表頁展示的設置list_display = ['id', 'name', 'gender']list_filter = ['gender']search_fields = ['name', 'content']list_display_links = ['name']list_per_page = 5# 增加和編輯頁的設置fieldsets = [('必填信息', {'fields': ['name', 'book_id']}),('選填信息', {'fields': ['gender', 'content']}), ]admin.site.register(Book, BookAdmin) admin.site.register(Hero, HeroAdmin)

最終效果展示

  • 書籍篩選
  • 人物篩選
  • 添加圖書信息
  • 添加人物信息
  • 分頁顯示

列表頁屬性性

list_display:顯示字段,可以點擊列頭進行排序
list_filter:過濾字段,過濾框會出現在右側
search_fields:搜索字段,搜索框會出現在上側
list_per_page:分頁,分頁框會出現在下側

添加、修改頁屬性

fields:屬性的先后順序
fieldsets :屬性分組, 注意: fields和fieldsets 只能設置一個.

fieldsets = [('必填信息', {'fields': ['name', 'book_id']}),('選填信息', {'fields': ['gender', 'content']}), ]

關聯對象

對于 Hero 模型類,有兩種注冊方式

  • 方式一:與 Book 模型類相同
  • 方式二:關聯注冊
    admin.StackedInline : 內嵌關聯注冊類
    admin.TabularInline : 表格 關聯注冊類
class HeroInline(admin.StackedInline):model = Heroextra = 3class BookAdmin(admin.ModelAdmin): list_display = ['pk', 'title', 'pub_date'] # .......此處省略部分重復代碼 inlines = [HeroInline]

Django快速入門: 前臺管理

第一步: URLconf 路由管理

  • 在 Django 中,定義 URLconf 包括正則表達式、視圖兩部分 。
  • Django 使用正則表達式匹配請求的URL,一旦匹配成功,則調用應用的視圖 。
  • 注意:只匹配路徑部分,即除去域名、參數后的字符串 。
  • 在主配置文件中添加子配置文件,使主 urlconf 配置連接到子模塊的 urlconf 配置文件 。

主配置文件配置如下, 已經配置過, 可以忽略此步驟:

# BookManage/urls.py urlpatterns = [ path('admin/', admin.site.urls), # 當用戶訪問的url地址以book開頭, 請訪問bookApp.urls這個url配置文件進行匹配并執行對應 的視圖函數. path('book/', include('bookApp.urls')), ]

bookApp 子應用的子配置文件如下:

# bookApp/urls.py urlpatterns = [ # 當用戶訪問bookApp應用的主頁時, 執行視圖函數index,反向根據名稱獲取url地址; path(r'', views.index, name='index'),# 顯示書籍的詳情頁, 接收一個int值并賦值給id path(r'<int:id>/', views.detail, name='detail'), ]

第二步: 視圖函數處理業務邏輯

  • 在 Django 中,視圖對WEB請求進行回應( response )。
  • 視圖接收 reqeust 請求對象作為第一個參數,包含了請求的信息 。
  • 視圖函數就是一個Python函數,被定義在 views.py 中 。
  • 定義完成視圖后,需要配置 urlconf ,否則無法處理請求。
# bookApp/views.py from django.shortcuts import render from django.http import HttpResponse def index(request): return HttpResponse("圖書管理系統")

訪問http://127.0.0.1/book查看效果

編輯 views.py 文件,在方法中調用模板 :

from django.shortcuts import render from django.http import HttpResponse# Create your views here. from bookApp.models import Book # 視圖:對用戶的請求(request)進行業務邏輯操作,最總返回給用戶響應(reponse) def index(request):books = Book.objects.all()#print("用戶請求的路徑:",request.path)#return HttpResponse(books)# 渲染:將上下文context{'books':books}填充到book/index.html代碼中return render(request,'book/index.html',{'books':books}) def detail(request, id):"""書籍詳情頁信息"""book = Book.objects.filter(id=id).first()heros = book.hero_set.all()return render(request, 'book/detail.html',{'book': book, 'heros': heros})

等待模板的代碼完善后, 再進行測試。

第三步: 模板管理實現好看的HTML頁面
作為Web 框架, Django 需要一種很便利的方法以動態地生成HTML。最常見的做法是使用模板。
模板包含所需HTML 輸出的靜態部分,以及一些特殊的語法,描述如何將動態內容插入。
(1) 模板引擎配置
創建模板的目錄如下圖:

# index.html文件 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body><h1 style="color:red">圖書管理系統</h1> </body> </html>

再次訪問測試

這里我們不能只是出現一個名字。我們要出現數據列表

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h1 style="color:red">圖書管理系統</h1> <ul>{% for book in books %}<li>{{ book.name }}</li>{% endfor %} </ul></body> </html>


等待模板的代碼完善后, 再進行測試。

(2) 模板語法: 變量
變量輸出語法

{ { var } }

當模版引擎遇到一個變量,將計算這個變量,然后將結果輸出。
變量名必須由字母、數字、下劃線(不能以下劃線開頭)和點組成。
當模版引擎遇到點("."),會按照下列順序查詢:

  • 字典查詢,例如: foo[“bar”]
  • 屬性或方法查詢,例如: foo.bar
  • 數字索引查詢,例如: foo[bar]
  • 如果變量不存在, 模版系統將插入’’ (空字符串)。

(3) 模板語法: 常用標簽
語法

{ % tag % }

作用

  • 在輸出中創建文本。
  • 控制循環或邏輯。
  • 加載外部信息到模板中。

for標簽

{% for ... in ... %} 循環邏輯 {% endfor %}

if標簽

{% if ... %} 邏輯1 {% elif ... %} 邏輯2 {% else %} 邏輯3 {% endif %}

comment標簽

{% comment %} 多行注釋 {% endcomment %}

include標簽
加載模板并以標簽內的參數渲染

{% include "base/left.html" %}

url :反向解析

{% url 'name' p1 p2 %}

csrf_token 標簽
用于跨站請求偽造保護

{% csrf_token %}

(4) 主頁與詳情頁前端HTML設計
定義 index.html 模板

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h1 style="color: blueviolet">圖書管理系統</h1> <ul>{% for book in books %}<li><a href="/book/{{ book.id }}/">{{ book.name }}</a></li>{% endfor %} </ul> </body> </html>

定義 detail.html 模板
在模板中訪問對象成員時,都以屬性的方式訪問,即方法也不能加括號

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title> </head> <body> <h1>{{book.name}}</h1> <h1>{{book.pub_date}}</h1> <h1>{{heros}}</h1> </body> </html>

訪問下面的鏈接, 測試運行是否成功:
http://127.0.0.1:8000/book/

Django請求的生命周期

wsgi : 封裝請求后交給后端的web框架( Flask、Django )。
請求中間件: 對請求進行校驗或在請求對象中添加其他相關數據,例如: csrf、
request.session 。
路由匹配: 根據瀏覽器發送的不同 url 去匹配不同的視圖函數。
視圖函數: 在視圖函數中進行業務邏輯的處理,可能涉及到: ORM、Templates 。
響應中間件: 對響應的數據進行處理。
wsgi : 將響應的內容發送給瀏覽器。

總結

本系統基本功能已經完成, 前端頁面可以搜索好看的 html 進行替換。
安裝配置 django 運行的環境
編寫模型,使用簡單 API 與數據庫交互
使用 Django 的后臺管理中維護數據
通過 視圖 接收請求,通過模型獲取數據,展示出來
調用模板完成展示

總結

以上是生活随笔為你收集整理的Django入门(二) 理解Django生命流程周期的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。