2.url與視圖函數

 

視圖函數

  1. 視圖函數的第一個參數必須是request,這個參數絕對不能少。
  2. 視圖函數的返回值必須是django.http.response.HttpResponseBase的子類的對象。

url傳遞參數:

url映射:

  1. 爲何會去urls.py文件中尋找映射呢?
    是由於在setting.py文件中配置了ROOT_URLCONFurls.py 因此Django會去urls.py
    中去尋找.
  2. urls.py中咱們全部的映射,都應該放在urlpattenrs這個變量中.
  3. 全部的映射不是隨便寫的,而是使用path函數或者re_path函數進行包裝的.

url傳參數

  1. 採用在url中使用變量的方式:在path的第一個參數中,使用<參數名>的方式能夠傳遞參數.
    而後在視圖函數中也要寫一參數,視圖函數中的參數必須和url中的參數名名稱保持一致,否則就找不到這個參數.另外,url中能夠傳遞多個參數.示例代碼以下:
    urlpatterns = [
            path('admin/', admin.site.urls),
            path('book/<book_id>/', views.book),
        ]
        def book(request,book_id):
            text = '書的id是%s' % book_id
            return HttpResponse(text)
  2. 採用查詢字符串的方式:在url中,不須要單獨的匹配查詢字符串的部分.只須要在視圖函數中使用
    request.GET.get('參數名稱')的方式來獲取.示例代碼以下:
def authoer_detail(request):
        author_id = request.GET('id')
        text = '做者的id是:%s' % author_id
        return HttpResponse(text)
        pass


由於查詢字符串使用的是GET請求,因此咱們經過request.GET來獲取參數.而且由於
GET是一個相似字典的數據類型,因此獲取值跟字典的方式都是同樣的.javascript

url參數的轉換器:

  1. str: 除了斜槓/覺得全部的字符都是能夠的.
  2. int: 只you是一個或者多個的阿拉伯數字.
  3. path: 全部的字符都是知足的.
  4. uuid: 只有知足uuid.uuid4()這個函數返回的字符串的格式.
  5. slug: 英文中的橫槓或者英文字符或者阿拉伯數字或者下劃線才知足.

urls模塊化

若是項目變得愈來愈大.那麼url會變得愈來愈多.若是都放在了住urls.py文件中,那麼將
不太好管理,所以咱們能夠將每一個app本身的urls都放到本身的app中進行管理.通常咱們會在app中
新建一個urls.py文件用來存儲全部和這個app相關的子url.
須要注意的地方:
1. 應該使用include函數包含子urls.py,而且這個urls.py的路徑是相對於項目的路徑.
示例代碼以下html

urlpatterns = [
    path('admin/',admin.site.urls),
    path('book',include('book.urls'))
]


2. 在appurls.py中,全部的url匹配也要放在一個叫作urlpatterns的變量中,不然找不到
3. url是會根據主urls.py和app中的urls.py進行拼接的,所以注意不要多加斜槓/.java

include函數的用法:

1.include(module,namespace=None):
* module: 子url的模塊字符串.
* namespace:實例命名空間.這個地方須要注意一點.若是制定實例命名空間,那麼前提必需要先制定應用命名空間,也就是在子urls.py中添加app_name變量.
2. include((pattern_list,app_namespace),namespace=None):include函數的第一個參數既能夠爲一個字符串,也能夠爲一個元組.若是是元組,那麼元組的第一個參數是子urls.py模塊的字符串,元組的第二個參數是應用命名空間.也就是說,應用命名空間既能夠在子urls.py中經過app_name制定,也能夠在include函數中制定.
3. include(pattern_list):pattern_list是一個列表,這個列表中裝的是path或者re_path函數.實例代碼以下:python

urlpatterns = [
    path('admin/',admin.site.urls),
    # 沒有制定應用命名空間,直接制定的是實例命名空間
    path('book/',include(('book.urls','book'))),
    path('movie/',include([
        path('',views.movie),
        path('list/',views.movie_list),
        ]))
]

url命名

爲何須要url命名?

由於url是常常變化的,若是在代碼中寫死,那麼後期更改會很是的麻煩.給url取個名字,之後使用url的時候就使用他的名字進行反轉就能夠了,就不須要寫死url了.ios

如何給一個url制定名稱?

path函數中,傳遞一個name參數就能夠制定.示例代碼以下:web

urlpatterns = [
    path('',views.index,name='index'),
    path('login/',views.login,name='login')
]

應用命名空間:

在多個APP之間,有可能產生同名的url,這時候爲了不反轉url的時候產生混淆,可使用應用命名空間,來作區分.定義應用命名空間很是簡單,只要在appurls.py中定義一個叫作app_name的變量,來制定這個應用的命名空間便可.示例代碼以下:django

# 應用命名空間
app_name = 'front'


之後在作反轉的時候就可使用應用命名空間:url名稱的方式進行反轉.示例代碼以下:api

login_url = reverse('front:login')

應用命名空間(app)和實例命名空間:

一個app,能夠建立多個實例.可使用多個url映射同一個app,全部這就會產生一個問題.之後在作反轉的時候,若是使用應用命名空間,那麼就會發生混淆.爲了不這個問題,咱們可使用實例命名空間.實例命名空間也是很是簡單的,只要在include函數中傳遞一個namespace變量便可.示例代碼以下:markdown

URLpatterns = [
    path('admin/',admin.site.urls),
    path('',include('frons.urls')),
    # 同一個app 下you兩個實例
    path('cms1/',include('csm.urls',namespace='cms1')),
    path('cms2/',include('csm.urls',namespace='cms2')),
]


之後在作反轉的時候,就能夠根據實例命名空間來制定具體的url.示例代碼以下:app

def index(request):
    username = request.GET.get("username")
    if username:
        return HttpResponse('CMS首頁')
    else:
        # 獲取當前的命名空間
        current_namespace = request.resolver_match.namespace
        return redirect(reverse('%s:login'%current_namespace))
相關文章
相關標籤/搜索