Django之Django快速體驗

Django快速體驗

 

前語:html

這一節內容是直接快速上手,後面的內容是對內容進行按步解釋,若是不想看解析的,能夠直接只看這一節的內容。

1.新建項目應用
新建項目test1
新建應用booktestpython

2.註冊應用
去test1下面的settings.py文件下注冊應用linux

INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'booktest', )
註冊應用

3.編寫數據庫相關代碼
編寫模型類代碼web

models.py正則表達式

from django.db import models # 設計和表對應的類-模型類 # Create your models here.


# 一類 # 圖書類
class BookInfo(models.Model): """圖書模型類"""
    # 圖書名稱,Charfield說明是一個字符串,max_length制定字符串的最大長度
    btitle = models.CharField(max_length=20) # 出版日期,Datefield說明是一個日期類型
    bpub_date = models.DateField() def __str__(self): # 返回書名
        return self.btitle # 多類 # 英雄類 # 關係屬性,hbook,創建圖書類和英雄人物類之間的一對多關係
class HeroInfo(models.Model): """英雄人物模型類""" hname = models.CharField(max_length=20)  # 英雄名稱
    # 性別,指定爲bool類型,False表明性別爲男
    hgender = models.BooleanField(default=False) # 備註/大招技能
    hcomment = models.CharField(max_length=120) hbook = models.ForeignKey("BookInfo") def __str__(self): # 返回英雄名
        return self.hname
models.py

4.數據遷移
進行數據遷移,命令行下:
生成遷移文件sql

python manage.py makemigrations

執行遷移生成表shell

python mange.py migrate

5.本地化
去settings.py下修改語言和時區數據庫

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

6.註冊超級用戶
命令行下:django

python manage.py createsuperuser

7.在應用下的admin.py中註冊模型類。
在應用下的admin.py文件對後臺管理進行配置
admin.pyubuntu

from django.contrib import admin from booktest.models import BookInfo,HeroInfo # 後臺管理相關文件 # Register your models here.


# 自定義模型管理類,控制在admin後臺顯示的字段信息
class BookInfoAdmin(admin.ModelAdmin): """圖書模型管理類""" list_display = ['id', 'btitle', 'bpub_date'] class HeroInfoAdmin(admin.ModelAdmin): """英雄模型管理類""" list_display = ['id', 'hname', 'hcomment'] # 註冊模型類
admin.site.register(BookInfo, BookInfoAdmin) admin.site.register(HeroInfo, HeroInfoAdmin)
admin.py

8.運行程序

linux在命令行下,進入虛擬環境,進入項目所在目錄;python manage.py runserver
pycharm下點擊右上角的朝右綠色箭頭,注意選中test1;或者點擊菜單欄的run,run "test1";再或者若是你的pycharm版本較高的話,
能夠點擊左下角的一個terminal,會進入命令行模式,

python manage.py runserver

9.後臺管理

在瀏覽器上輸入:http://127.0.0.1:8000/admin
輸入超級用戶帳號和密碼
便可進行數據庫操做,增刪改查

10.視圖代碼編寫
views.py

from django.shortcuts import render from django.http import HttpResponse from django.template import loader, RequestContext # Create your views here.

def my_render(request, template_path, context_dict={}): """使用模板文件"""
    # 使用模板文件
    # 1.加載模板文件
    temp= loader.get_template(template_path) # 2.定義模板上下文:給模板傳數據
    context = RequestContext(request, context_dict) # 3.模板渲染:產生標準的html內容
    res_html = temp.render(context) # 4.返回給瀏覽器
    return HttpResponse(res_html) # 1.定義視圖函數,HttpRequest # 2.進行url配置,目的是創建url地址和視圖的對應關係 # http://127.0.0.1:8000/index
def index(request): # 進行處理,和M與T進行交互
    # return HttpResponse("okay")

    # # 使用模板文件
    # # 1.加載模板文件
    # temp= loader.get_template('booktest/index.html')
    # # 2.定義模板上下文:給模板傳數據
    # context = RequestContext(request, {})
    # # 3.模板渲染:產生標準的html內容
    # res_html = temp.render(context)
    # # 4.返回給瀏覽器
    # return HttpResponse(res_html)
    # my_render(request, "booktest/index.html")
    return render(request, "booktest/index.html", {'content': 'hello world', 'list': list(range(1, 10))}) def index2(request): # 進行處理,和M與T進行交互
    return HttpResponse("hello index2")
views.py

11.靜態文件夾和靜態文件
新建templates文件夾
templates下新建booktest文件夾
booktest下新建index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    <h2>index頁面</h2> 使用模板文件:<br/>
    <h3>{{ content }}</h3> <br/> 使用列表:<br/>
    <p>{{ list }}</p> <br/> for循環:<br/>
    <ul> {% for i in list %} <li>{{ i }}</li> {% endfor %} </ul>
</body>
</html>
index.html

12.設置templates模板文件目錄
去settings.py下設置模板文件目錄

TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, "templates")],  # 設置模板文件目錄
        'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
設置模板文件目錄

13.應用路由分發
在應用下新建urls.py文件,寫入

booktest/urls.py from django.conf.urls import url from booktest import views # 在應用的urls文件中進行url匹配的時候,應嚴控控制匹配的開頭和結尾
urlpatterns = [ # 經過url函數設置路由配置項
    url('^index$', views.index),  # 創建index路由和視圖index之間的關係
    url('^index2$', views.index2),  # 創建index路由和視圖index之間的關係
]
booktest/urls.py

14.項目路由分發
test1/urls.py

from django.conf.urls import include, url from django.contrib import admin from booktest import urls # 項目的urls文件
urlpatterns = [ url(r'^admin/', include(admin.site.urls)),  # 配置項目
    url(r'^', include('booktest.urls')),  # 配置項目,包含booktest應用中的urls文件
]
test1/urls.py

15.快速體驗web

在瀏覽器上輸入:http://127.0.0.1:8000/index
便可看到一個有數據的界面

 

ORM簡介

ORM

  1. django中內嵌了ORM框架,ORM框架能夠將類和數據表進行對應起來,只須要經過類和對象就能夠對數據表進行操做。
  2. 設計類:模型類。
  3. ORM另一個做用:根據設計的類生成數據庫中的表。
  4. 在model.py中設計和表對應的類-模型類;

 

模型

模型類設計

模型類設計和表生成

  • 在應用models.py中設計模型類。
  • 必須繼承於models.Model類。

1)設計BookInfo類。
2)設計HeroInfo類。
Models.ForeignKey能夠創建兩個模型類之間一對多的關係,django在生成表的時候,就會在多的表中建立一列做爲外鍵,創建兩個表之間一對多的關係。

from django.db import models # 設計和表對應的類,模型類 # Create your models here.

# 一類 # 圖書類
class BookInfo(models.Model): '''圖書模型類'''
    # 圖書名稱,CharField說明是一個字符串,max_length指定字符串的最大長度
    btitle = models.CharField(max_length=20) # 出版日期,DateField說明是一個日期類型
    bpub_date = models.DateField() def __str__(self): # 返回書名
        return self.btitle # 多類 # 英雄人物類 # 英雄名 hname # 性別 hgender # 年齡 hage # 備註 hcomment # 關係屬性 hbook,創建圖書類和英雄人物類之間的一對多關係
class HeroInfo(models.Model): '''英雄人物模型類''' hname = models.CharField(max_length=20) # 英雄名稱
    # 性別,BooleanField說明是bool類型,default指定默認值,False表明男
    hgender = models.BooleanField(default=False) # 備註
    hcomment = models.CharField(max_length=128) # 關係屬性 hbook,創建圖書類和英雄人物類之間的一對多關係
    # 關係屬性對應的表的字段名格式: 關係屬性名_id
    hbook = models.ForeignKey('BookInfo') def __str__(self): # 返回英雄名
        return self.hname

 

模型類生成表

1)生成遷移文件
命令:

python manage.py makemigrations

遷移文件是根據模型類生成的。

2)執行遷移生成表
命令:

python mange.py migrate

根據遷移文件生成表。
生成表名的默認格式:應用名_模型類名小寫

模型類表生成示例

// 在model.py文件編寫好模型類代碼,進入虛擬環境 (cp15) python@ubuntu:~/day01/test1$ python manage.py makemigrations    //生成遷移文件 (cp15) python@ubuntu:~/day01/test1$ python mange.py migrate    //執行遷移文件表 (cp15) python@ubuntu:~/day01/test1$ sudo apt-get install sqliteman    //安裝可視數據庫軟件sqliteman (cp15) python@ubuntu:~/day01/test1$ sqliteman    //打開可視數據庫軟件

django默認使用的數據庫是sqlite,單這只是小型數據庫,不知足web開發需求,僅適用於手機端的軟件,因此咱們通常不用這個,這裏瞭解認識一下;

 

經過模型類操做數據表

進入項目shell的命令:

python manage.py shell

如下爲在相互shell終端中演示的例子:
首先導入模型類:

from booktest.models import BookInfo,HeroInfo

1)向booktest_bookinfo表中插入一條數據。

b = BookInfo()  # 定義一個BookInfo類的對象
b.btitle ='天龍八部'  # 定義b對象的屬性並賦值
b.bpub_date = date(1990,10,11) b.save() # 纔會將數據保存進數據庫

2)查詢出booktest_bookinfo表中id爲1的數據。

b = BookInfo.objects.get(id=1)

3)在上一步的基礎上改變b對應圖書的出版日期。

b.bpub_date = date(1989,10,21) b.save() #纔會更新表格中的數據

4)緊接上一步,刪除b對應的圖書的數據。

b.delete() #纔會刪除

5)向booktest_heroInfo表中插入一條數據。

h = HeroInfo() h.hname = '郭靖' h.hgender = False h.hcomment = ‘降龍十八掌’ b2 = BookInfo.objects.get(id=2) h.hbook = b2 #給關係屬性賦值,英雄對象所屬的圖書對象
h.save()

6)查詢圖書表裏面的全部內容。

BookInfo.objects.all() HeroInfo.objects.all()

 

關係操做

1)查詢出id爲2的圖書中全部英雄人物的信息。

b = BookInfo.objects.get(id=2) b.heroinfo_set.all() #查詢出b圖書中全部英雄人物的信息

 

模型-模型類關係和關係查詢示例

(cp15) python@ubuntu:~/day01/test1$ python manage.py shell python@ubuntu:~$ workon cp15 (cp15) python@ubuntu:~$ ls day01 Desktop Downloads examples.desktop Pictures Templates workspace dbs Documents dump.rdb Music Public Videos (cp15) python@ubuntu:~$ cd day01 (cp15) python@ubuntu:~/day01$ ls test1 (cp15) python@ubuntu:~/day01$ cd test1 (cp15) python@ubuntu:~/day01/test1$ python manage.py shell Python 3.5.2 (default, Nov 12 2018, 13:43:14) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole) >>> from booktest.models import BookInfo,HeroInfo >>> b = BookInfo() >>> b.title = '天龍八部'
>>> from datetime import date >>> b.bpub_date = date(1990,1,1) >>> b.save() >>> b.btitle = '天龍八部'
>>> b.save() >>> h = HeroInfo() >>> h.hname = '段譽'
>>> h.hgender = False >>> h.hcomment = '六脈神劍'
>>> h.hbook = b >>> h.save() >>> h2 = HeroInfo() >>> h2.hname = '喬峯'
>>> h2.hgender = False >>> h2.hcomment = '降龍十八掌'
>>> h2.hbook = b >>> h2.save() >>> h3 = HeroInfo.objects.get(id=2) >>> h3.hname '喬峯'
>>> h3.hbook_id 1
>>> h3.hbook <BookInfo: BookInfo object>
>>> h3.hbook.btitle '天龍八部'

# 查詢書籍表中全部包含的英雄列表
>>> b.heroinfo_set.all() [<HeroInfo: HeroInfo object>, <HeroInfo: HeroInfo object>] # 查詢書籍表裏面有多少數據
>>> BookInfo.objects.all() [<BookInfo: BookInfo object>] >>> quit()
模型類關係和關係查詢示例

 一對多的時候,若是你要往多類裏面的表加一條數據,由於一類和多類有對應關係,那麼給多類對象增長屬性的時候,它的外鍵賦值必須爲一個跟一類關聯的對象;

b = BookInfo() h2 = HeroInfo() h2.hbook = b

 

 

Django後臺管理

後臺管理
1)本地化
語言和時區的本地化。
修改settings.py文件,修改後臺django語言和時區,zh-hans,Asia/Shanghai

# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

 

2)建立管理員
命令:

python manage.py createsuperuser

建立超級用戶及運行演示示例

(cp15) python@ubuntu:~/day01/test1$ python manage.py createsuperuser Username (leave blank to use 'python'): admin Email address: Password: Password (again): Superuser created successfully. (cp15) python@ubuntu:~/day01/test1$ python manage.py runserver Performing system checks... // 瀏覽器打開 http://127.0.0.1:8000/admin/
// 帳號admin 密碼root

 

3)註冊模型類
在應用下的admin.py中註冊模型類。
告訴djang框架根據註冊的模型類來生成對應表管理頁面。

// admin.py

from django.contrib import admin from booktest.models import BookInfo,HeroInfo # 後臺管理相關文件 # Register your models here.


# 註冊模型類
admin.site.register(BookInfo) admin.site.register(HeroInfo)

// models.py

from django.db import models # 設計和表對應的類-模型類 # Create your models here.

# 一類 # 圖書類
class BookInfo(models.Model): """圖書模型類"""
    # 圖書名稱,Charfield說明是一個字符串,max_length制定字符串的最大長度
    btitle = models.CharField(max_length=20) # 出版日期,Datefield說明是一個日期類型
    bpub_date = models.DateField() def __str__(self): # 返回書名
        return self.btitle # 多類 # 英雄類 # 關係屬性,hbook,創建圖書類和英雄人物類之間的一對多關係
class HeroInfo(models.Model): """英雄人物模型類""" hname = models.CharField(max_length=20)  # 英雄名稱
    # 性別,指定爲bool類型,False表明性別爲男
    hgender = models.BooleanField(default=False) # 備註/大招技能
    hcomment = models.CharField(max_length=120) hbook = models.ForeignKey("BookInfo") def __str__(self): # 返回英雄名
        return self.hname
models.py

 

若是沒有使用__str__方法的話,就會在admin頁面上顯示xxx.object,由於:

b = BookInfo.objects.get(btitle='天龍八部') c = str(b)

而頁面上的xxx.object就是str(b),若是咱們要讓admin頁面上顯示其餘,就重寫__str__方法。

能夠使用admin後臺管理添加修改刪除數據,由於是可視化界面,請自行嘗試;


4)自定義管理頁面(部分)
自定義模型管理類。模型管理類就是告訴django在生成的管理頁面上顯示哪些內容。

from django.contrib import admin from booktest.models import BookInfo,HeroInfo # 後臺管理相關文件 # Register your models here.


# 自定義模型管理類,控制在admin後臺顯示的字段信息
class BookInfoAdmin(admin.ModelAdmin): """圖書模型管理類""" list_display = ['id', 'btitle', 'bpub_date'] class HeroInfoAdmin(admin.ModelAdmin): """英雄模型管理類""" list_display = ['id', 'hname', 'hcomment'] # 註冊模型類
admin.site.register(BookInfo, BookInfoAdmin) admin.site.register(HeroInfo, HeroInfoAdmin)
admin.py

 

視圖

在Django中,經過瀏覽器去請求一個頁面時,使用視圖函數來處理這個請求的,視圖函數處理以後,要給瀏覽器返回頁面內容。

視圖函數的使用
1)定義視圖函數
視圖函數定義在views.py中。
例:

def index(request): #進行處理。。。
    return HttpResponse('hello python')

視圖函數必須有一個參數request,進行處理以後,須要返回一個HttpResponse的類對象,hello python就是返回給瀏覽器顯示的內容。

views.py

from django.shortcuts import render from django.http import HttpResponse # Create your views here.


# 1.定義視圖函數,HttpRequest # 2.進行url配置,目的是創建url地址和視圖的對應關係 # http://127.0.0.1:8000/index
def index(request): # 進行處理,和M與T進行交互
    return HttpResponse("okay") def index2(request): # 進行處理,和M與T進行交互
    return HttpResponse("hello index2")
views.py

2)進行url配置

 


url配置的目的是讓創建url和視圖函數的對應關係。url配置項定義在urlpatterns的列表中,每個配置項都調用url函數。
url函數有兩個參數,第一個參數是一個正則表達式,第二個是對應的處理動做。

配置url時,有兩種語法格式:

  • a) url(正則表達式,視圖函數名)
  • b) url(正則表達式,include(應用中的urls文件))

工做中在配置url時,首先在項目的urls.py文件中添加配置項時,並不寫具體的url和視圖函數之間的對應關係,而是包含具體應用的urls.py文件,在應用的urls.py文件中寫url和視圖函數的對應關係。

在應用booktest下新建urls.py,
booktest/urls.py

from django.conf.urls import url from booktest import views # 在應用的urls文件中進行url匹配的時候,應嚴控控制匹配的開頭和結尾
urlpatterns = [ # 經過url函數設置路由配置項
    url('^index$', views.index),  # 創建index路由和視圖index之間的關係
    url('^index2$', views.index2),  # 創建index路由和視圖index之間的關係
]
booktest/urls.py

test1/urls.py

from django.conf.urls import include, url from django.contrib import admin from booktest import urls # 項目的urls文件
urlpatterns = [ url(r'^admin/', include(admin.site.urls)),  # 配置項目
    url(r'^', include('booktest.urls')),  # 配置項目,包含booktest應用中的urls文件
]
test1/urls.py

 

url匹配的過程
在項目的urls.py文件中包含具體應用的urls.py文件,應用的urls.py文件中寫url和視圖函數的對應關係。

 

當用戶輸入如http://127.0.0.1:8000/aindex時,去除域名和最前面的/,剩下aindex,

拿aindex字符串到項目的urls文件中進行匹配,配置成功以後,去除匹配的a字符,

那剩下的index字符串繼續到項目的urls文件中進行正則匹配,匹配成功以後執行視圖函數index,

index視圖函數返回內容hello python給瀏覽器來顯示。

注意一下http://127.0.0.1:8000/index和http://127.0.0.1:8000/index/,後面的可能會在嚴控匹配開頭結尾時出錯。

 

模板

模板不單單是一個html文件。

模板文件的使用
1)建立模板文件夾
2)配置模板目錄
3) 使用模板文件
  a)加載模板文件
    去模板目錄下面獲取html文件的內容,獲得一個模板對象。
  b)定義模板上下文
    向模板文件傳遞數據。
  c)模板渲染
    獲得一個標準的html內容。

給模板文件傳遞數據

模板變量使用:{{ 模板變量名 }} 模板代碼段:{%代碼段%} for循環: {% for i in list %} {% endfor %}

 

在項目目錄下新建templates文件夾,和應用同級;

去settings文件配置模板目錄

TEMPLATES = [ { 'DIRS': [os.path.join(BASE_DIR, "templates")],  # 設置模板文件目錄
 }, ]

 

若是有多個應用,爲了避免混淆html文件,會在templates下再對每一個應用新建一個對應名文件;

templates/test1/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
    <h2>index頁面</h2> 使用模板文件:<br/>
    <h3>{{ content }}</h3> <br/> 使用列表:<br/>
    <p>{{ list }}</p> <br/> for循環:<br/>
    <ul> {% for i in list %} <li>{{ i }}</li> {% endfor %} </ul>
</body>
</html>
templates/test1/index.html

views.py

from django.shortcuts import render from django.http import HttpResponse from django.template import loader, RequestContext # Create your views here.

def my_render(request, template_path, context_dict={}): """使用模板文件"""
    # 使用模板文件
    # 1.加載模板文件
    temp= loader.get_template(template_path) # 2.定義模板上下文:給模板傳數據
    context = RequestContext(request, context_dict) # 3.模板渲染:產生標準的html內容
    res_html = temp.render(context) # 4.返回給瀏覽器
    return HttpResponse(res_html) # 1.定義視圖函數,HttpRequest # 2.進行url配置,目的是創建url地址和視圖的對應關係 # http://127.0.0.1:8000/index
def index(request): # 進行處理,和M與T進行交互
    # return HttpResponse("okay")

    # # 使用模板文件
    # # 1.加載模板文件
    # temp= loader.get_template('booktest/index.html')
    # # 2.定義模板上下文:給模板傳數據
    # context = RequestContext(request, {})
    # # 3.模板渲染:產生標準的html內容
    # res_html = temp.render(context)
    # # 4.返回給瀏覽器
    # return HttpResponse(res_html)
    # my_render(request, "booktest/index.html")
    return render(request, "booktest/index.html", {'content': 'hello world', 'list': list(range(1, 10))})
views.py

其中,render函數至關於執行了上面的my_render函數,實際開發中只要寫render便可,這裏是爲了理解render的做用而演示;

 

MVT綜合案例

案例完成
編碼以前的準備工做:
1)設計出訪問頁面的url和對應的視圖函數的名字,肯定視圖函數的功能。
2)設計模板文件的名字。


如下爲案例中的簡單設計過程:
1)完成圖書信息的展現:
  a)設計url,經過瀏覽器訪問 http://127.0.0.1:8000/books/ 時顯示圖書信息頁面。
  b)設計url對應的視圖函數show_books。
    查詢出全部圖書的信息,將這些信息傳遞給模板文件。
  c)編寫模板文件show_books.html。
    遍歷顯示出每一本圖書的信息。

2)完成點擊某本圖書時,顯示出圖書裏全部英雄信息的頁面。
  a)設計url,經過訪問http://127.0.0.1:8000/數字/時顯示對應的英雄信息頁面。
    這裏數字指點擊的圖書的id。
  b)設計對應的視圖函數detail。
    接收圖書的id,根據id查詢出相應的圖書信息,而後查詢出圖書中的全部英雄信息。
  c)編寫模板文件detail.html。


指定項目運行ip及端口:python manage.py runserver 127.0.0.1:8888

 

綜合案例代碼

booktest/admin.py

from django.contrib import admin from booktest.models import BookInfo,HeroInfo # 後臺管理相關文件 # Register your models here. # 自定義模型管理類
class BookInfoAdmin(admin.ModelAdmin): '''圖書模型管理類''' list_display = ['id', 'btitle', 'bpub_date'] class HeroInfoAdmin(admin.ModelAdmin): '''英雄人物模型管理類''' list_display = ['id', 'hname', 'hcomment'] # 註冊模型類 # admin.site.register(BookInfo)
admin.site.register(BookInfo, BookInfoAdmin) admin.site.register(HeroInfo, HeroInfoAdmin)
admin.py

booktest/models.py

from django.db import models # 設計和表對應的類,模型類 # Create your models here.

# 一類 # 圖書類
class BookInfo(models.Model): '''圖書模型類'''
    # 圖書名稱,CharField說明是一個字符串,max_length指定字符串的最大長度
    btitle = models.CharField(max_length=20) # 出版日期,DateField說明是一個日期類型
    bpub_date = models.DateField() def __str__(self): # 返回書名
        return self.btitle # 多類 # 英雄人物類 # 英雄名 hname # 性別 hgender # 年齡 hage # 備註 hcomment # 關係屬性 hbook,創建圖書類和英雄人物類之間的一對多關係
class HeroInfo(models.Model): '''英雄人物模型類''' hname = models.CharField(max_length=20) # 英雄名稱
    # 性別,BooleanField說明是bool類型,default指定默認值,False表明男
    hgender = models.BooleanField(default=False) # 備註
    hcomment = models.CharField(max_length=128) # 關係屬性 hbook,創建圖書類和英雄人物類之間的一對多關係
    # 關係屬性對應的表的字段名格式: 關係屬性名_id
    hbook = models.ForeignKey('BookInfo') def __str__(self): # 返回英雄名
        return self.hname
models.py

booktest/views.py

from django.shortcuts import render from django.http import HttpResponse from booktest.models import BookInfo # 導入圖書模型類
from django.template import loader,RequestContext def my_render(request, template_path, context_dict={}): '''使用模板文件'''
    # 使用模板文件
    # 1.加載模板文件, 模板對象
    temp = loader.get_template(template_path) # 2.定義模板上下文:給模板文件傳遞數據
    context = RequestContext(request, context_dict) # 3.模板渲染:產生標準的html內容
    res_html = temp.render(context) # 4.返回給瀏覽器
    return HttpResponse(res_html) # Create your views here. # 1.定義視圖函數,HttpRequest # 2.進行url配置,創建url地址和視圖的對應關係 # http://127.0.0.1:8000/index
def index(request): # 進行處理,和M和T進行交互。。。
    # return HttpResponse('老鐵,沒毛病')
    # return my_render(request, 'booktest/index.html')
    return render(request, 'booktest/index.html', {'content':'hello world', 'list':list(range(1,10))}) # http://127.0.0.1:8000/index2
def index2(request): return HttpResponse('hello python') def show_books(request): '''顯示圖書的信息'''
    # 1.經過M查找圖書表中的數據
    books = BookInfo.objects.all() # 2.使用模板
    return render(request, 'booktest/show_books.html', {'books':books}) def detail(request, bid): '''查詢圖書關聯英雄信息'''
    # 1.根據bid查詢圖書信息
    book = BookInfo.objects.get(id=bid) # 2.查詢和book關聯的英雄信息
    heros = book.heroinfo_set.all() # 3.使用模板
    return render(request, 'booktest/detail.html', {'book':book, 'heros':heros})
views.py

booktest/urls.py

from django.conf.urls import url from booktest import views # index # index2 # index2/ # 在應用的urls文件中進行url配置的時候: # 1.嚴格匹配開頭和結尾
urlpatterns = [ # 經過url函數設置url路由配置項
    url(r'^index$', views.index), # 創建/index和視圖index之間的關係
    url(r'^index2$', views.index2), url(r'^books$', views.show_books), # 顯示圖書信息
    url(r'^books/(\d+)$', views.detail), # 顯示英雄信息
]
booktest/urls.py

test1/urls.py

from django.conf.urls import include, url from django.contrib import admin # 項目的urls文件
urlpatterns = [ url(r'^admin/', include(admin.site.urls)), # 配置項目
    url(r'^', include('booktest.urls')), # 包含booktest應用中的urls文件
]
test1/urls.py

templates/detail.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>顯示圖書關聯的英雄信息</title>
</head>
<body>
<h1>{{ book.btitle }}</h1> 英雄信息以下:<br/>
<ul> {% for hero in heros %} <li>{{ hero.hname }}--{{ hero.hcomment }}</li> {% empty %} <li>沒有英雄信息</li> {% endfor %} </ul>
</body>
</html>
detail.html

templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板文件</title>
</head>
<body>
<h1>這是一個模板文件</h1> 使用模板變量:<br/> {{ content }}<br/> 使用列表:<br/> {{ list }}<br/> for循環:<br/>
<ul> {% for i in list %} <li>{{ i }}</li> {% endfor %} </ul>
</body>
</html>
index.html

templates/show_books.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>顯示圖書信息</title>
</head>
<body> 圖書信息以下: <ul> {% for book in books %} <li><a href="/books/{{ book.id }}">{{ book.btitle }}</a></li> {% endfor %} </ul>
</body>
</html>
show_books.html

 

原文出處:https://www.cnblogs.com/yifchan/p/python-1-24.html

相關文章
相關標籤/搜索