
## 視圖
視圖一般都寫在app的views.py中。并且視圖的第一個參數永遠都是request(一個HttpRequest)對象。這個對象存儲了請求過來的所有信息,包括攜帶的參數以及一些頭部信息等。在視圖中,一般是完成邏輯相關的操作。比如這個請求是添加一篇博客,那么可以通過request來接收到這些數據,然后存儲到數據庫中,最后再把執行的結果返回給瀏覽器。視圖函數的返回結果必須是HttpResponseBase對象或者子類的對象。示例代碼如下:
news/views.py
```
from django.http import HttpResponse
def news(request):
return HttpResponse("新聞!")
```
urls.py
```
from news import views
urlpatterns = [
path("news",views.news)
]
```
### URL映射
視圖寫完后,要與URL進行映射,也即用戶在瀏覽器中輸入什么url的時候可以請求到這個視圖函數。在用戶輸入了某個url,請求到我們的網站的時候,django會從項目的urls.py文件中尋找對應的視圖。在urls.py文件中有一個urlpatterns變量,以后django就會從這個變量中讀取所有的匹配規則。匹配規則需要使用django.urls.path函數進行包裹,這個函數會根據傳入的參數返回URLPattern或者是URLResolver的對象。示例代碼如下:
```
from django.contrib import admin
from django.urls import path
from book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list)
]
```
### URL中添加參數
有時候,url中包含了一些參數需要動態調整。比如簡書某篇文章的詳情頁的url,是https://www.jianshu.com/p/a5aab9c4978e后面的a5aab9c4978e就是這篇文章的id,那么簡書的文章詳情頁面的url就可以寫成https://www.jianshu.com/p/<id>,其中id就是文章的id。那么如何在django中實現這種需求呢。這時候我們可以在path函數中,使用尖括號的形式來定義一個參數。比如我現在想要獲取一本書籍的詳細信息,那么應該在url中指定這個參數。示例代碼如下:
```
from django.contrib import admin
from django.urls import path
from book import views
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list),
path('book/<book_id>/',views.book_detail)
]
------------------------------------------------------------------
views.py中的代碼如下:
def book_detail(request,book_id):
text = "您輸入的書籍的id是:%s" % book_id
return HttpResponse(text)
```
也可以通過查詢字符串的方式傳遞一個參數過去。示例代碼如下:
```
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',views.book_list),
path('book/detail/',views.book_detail)
]
------------------------------------------------------------------
views.py中的代碼如下:
def book_detail(request):
book_id = request.GET.get("id")
text = "您輸入的書籍id是:%s" % book_id
return HttpResponse(text)
```
### URL模塊化
URL中包含另外一個urls模塊:
在我們的項目中,不可能只有一個app,如果把所有的app的views中的視圖都放在urls.py中進行映射,肯定會讓代碼顯得非常亂。因此django給我們提供了一個方法,可以在app內部包含自己的url匹配規則,而在項目的urls.py中再統一包含這個app的urls。使用這個技術需要借助include函數。示例代碼如下:
```
# django_first/urls.py文件:
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('book/',include("book.urls"))
]
```
在urls.py文件中把所有的和book這個app相關的url都移動到app/urls.py中了,django_first/urls.py中,通過include函數包含book.urls,以后在請求book相關的url的時候都需要加一個book的前綴。
### Django內置轉換器
```
from django.urls import converters
```
UUID:https://www.cnblogs.com/franknihao/p/7307224.html
### url命名與反轉
- 1.為什么需要URL命名
因為在項目開發的過程中URL地址可能經常變動,如果寫死會經常去修改
- 2.如何給一個URL指定名稱
path("",views.index,name="index")
- 3.應用命名空間
在多個app之間可能產生同名的URL,這時候為了避免這種情況,可以使用命名空間來加以區分。在urls.py中添加app_name即可。
### 應用命名空間和實例命名空間
一個app,可以創建多個實例。可以使用多個URL映射同一個App。在做反轉的時候,如果使用應用命名空間,就會發生混淆,為了避免這個問題,可以使用實例命名空間,實例命名空間使用,namespace='實例命名空間'
```
urls.py
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('cms1/', include("cms.urls",namespace='cms1')),
path('cms2/', include("cms.urls",namespace='cms2')),
path('front/', include("front.urls")),
]
```
### URL反轉傳遞參數
如果這個url中需要傳遞參數,那么可以通過kwargs來傳遞參數。
```
reverse("book:detail",kwargs={"book_id":1})
```
因為django中的reverse反轉url的時候不區分GET請求和POST請求,因此不能在反轉的時候添加查詢字符串的參數。如果想要添加查詢字符串的參數,只能手動的添加。
```
login_url = reverse("front:singin") + "?name=jr"
return redirect(login_url)
```
### 指定默認的參數
```
article/views.py
-----------------------------------------------------------------
from django.http import HttpResponse
# Create your views here.
article_lists = ["a","b","c"]
def article(request):
return HttpResponse(article_lists[0])
def page(request,page_id=0):
return HttpResponse(article_lists[page_id])
-------------------------------------------------------------------
article/urls.py
from django.urls import re_path,path
from . import views
urlpatterns = [
path("",views.article),
path("page/",views.page),
path("page/<int:page_id>",views.page),
]
```
### re_path函數
有時候我們在寫url匹配的時候,想要寫使用正則表達式來實現一些復雜的需求,那么這時候我們可以使用re_path來實現。re_path的參數和path參數一模一樣,只不過第一個參數也就是route參數可以為一個正則表達式。
```
article/urls.py
------------------------------------------------------------------
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r"^$",views.article),
re_path(r"^article_list/(?P<year>\d{4})/",views.article_list)
re_path(r"^article_list/(?P<mouth>\d{2})/",views.article_mouth)
]
```
- 空白目錄
- 1-Django前導知識
- 1-1-虛擬環境
- 1-2-Django框架介紹與環境搭建
- 2-URL與視圖
- 2-1-URL與視圖
- 3-模板
- 3-1-模板介紹
- 3-2-模板變量
- 3-3-常用標簽
- 3-4-模板常用過濾器
- 3-5-模板結構優化
- 3-6-加載靜態文件
- 4-數據庫
- 4-1-操作數據庫
- 4-2-圖書管理系統
- 4-3-ORM模型介紹
- 4-4-ORM模型的增刪改查
- 4-5-模型常用屬性
- 4-6-外鍵和表
- 4-7-查詢操作
- 4-8-QuerySet的方法
- 4-9-ORM模型練習
- 4-10-ORM模型遷移
- 5-視圖高級
- 1-Django限制請求method
- 2-頁面重定向
- 3-HttpRequest對象
- 4-HttpResponse對象
- 5-類視圖
- 6-錯誤處理
- 6-表單
- 1-用表單驗證數據
- 2-ModelForm
- 3-文件上傳
- 7-session和cookie
- 1-session和cookie
- 8-memcached
- 1-memcached
- 9-阿里云部署
- 阿里云部署