Django立項和URL的使用(二)

Django立項和URL的使用

1,第一個Django項目

1,建立Django項目

  ㈠用命令行的方式

①建立項目:打開終端,使用命令:django-admin startproject [項目名稱]便可建立。好比:python

django-admin startproject first_project

②運行項目:在終端,進入到項目文件夾中,而後執行如下命令便可運行:web

python manage.py runserver

這樣能夠在本地訪問你的網站,默認端口號是8000,這樣就能夠在瀏覽器中經過http://127.0.0.1:8000/來訪問你的網站啦。若是想要修改端口號,那麼在運行的時候能夠指定端口號,python manage.py runserver 9000這樣就能夠經過9000端口來訪問啦。另外,這樣運行的項目只能在本機上能訪問,若是想要在其餘電腦上也能訪問本網站,那麼須要指定ip地址爲0.0.0.0。示例爲:python manage.py runserver 0.0.0.0:8000正則表達式

③建立應用(app):一個項目相似因而一個架子,可是真正起做用的仍是app。在終端進入到項目所在的路徑,而後執行python manage.py startapp [app名稱]建立一個app。數據庫

  ㈡用pycharm的方式

①建立項目:用pycharm新建一個Django項目,新建項目的截圖以下:django

  使用pycharm建立完項目後,仍是須要從新進入到命令行單首創建app的。flask

  建立app:在cmd中進入項目文件夾,並處於虛擬環境,執行如下代碼瀏覽器

python manage.py startapp book
# book爲app的名稱,可修改

②運行Django項目:安全

  1,經過pycharm運行。直接點擊右上角的綠色箭頭按鈕便可運行。服務器

  2,修改端口號:右上角→項目配置→port。更改端口號,從新運行。app

  3,如何讓同局域網的其餘電腦訪問本機的項目:

    1,讓項目運行時,host爲0.0.0.0。

      在終端,使用命令

python manage.py runserver 0.0.0.0:8000

      在pycharm,右上角→項目配置→host。改爲 0.0.0.0

    2,而且在settings.py中的ALLOWED_HOSTS = [' 裏面填上本身的那個ip ']

      注意:要關閉本身電腦的防火牆。

  4,注意:用pycharm運行項目,要避免一個項目運行屢次。能夠經過勾選pycharm中只用單一實例選項避免該問題發生。

2,項目結構介紹

  1. manage.py:之後和項目交互基本上都是基於這個文件。通常都是在終端輸入python manage.py [子命令]。能夠輸入python manage.py help看下能作什麼事情。除非你知道你本身在作什麼,通常狀況下不該該編輯這個文件。
  2. settings.py:本項目的設置項,之後全部和項目相關的配置都是放在這個裏面。
  3. urls.py:這個文件是用來作url與視圖函數映射的。之後來了一個請求,就會從這個文件中找到匹配的視圖函數。
  4. wsgi.py:專門用來作部署的。項目與WSGI協議兼容的web服務器入口,部署的時候須要用到的,通常也不須要修改的。

3,project和app的關係

  appdjango項目的組成部分。一個app表明項目中的一個模塊,全部URL請求的響應都是由app來處理。好比豆瓣,裏面有圖書,電影,音樂,同城等許許多多的模塊,若是站在django的角度來看,圖書,電影這些模塊就是app,圖書,電影這些app共同組成豆瓣這個項目。所以這裏要有一個概念,django項目由許多app組成,一個app能夠被用到其餘項目,django也能擁有不一樣的app

4,Django推薦的項目規範

按照功能或者模塊進行分層,分紅一個一個app。全部和某個模塊相關的視圖都寫在對應的app的views.py中,而且模型和其餘的也是相似。而後django已經提供了一個比較方便建立app的命令叫作python manage.py startapp [app的名稱]。把全部的代碼寫在各自的app中。

5,DEBUG模式

1,若是開啓了DEBUG模式,那麼之後咱們修改了Django項目的代碼,而後按下ctrl+s,那麼Django就會自動給咱們重啓項目,無需手動重啓項目。

2,若是開啓了DEBUG模式,那麼之後Django項目中的代碼出現bug了,那麼在瀏覽器中和控制檯會打印出錯信息。

3,在生產環境中,禁止開啓DEBUG模式,否則可能會泄露代碼,形成很大的安全隱患。

4,關閉DEBUG模式:DEBUG=False,當設置False以後,須要設置ALLOWED_HOSTS的參數,不然不能正常運行。

6,ALLOWED_HOSTS

這個變量是用來設置之後別人只能經過這個變量中的ip地址或者域名來進行訪問該項目。

127.0.0.1表明的是本機的ip地址。

2,URL分發器

1,視圖

視圖通常都寫在app的views.py中。

①視圖的第一個參數永遠都是request(一個HttpRequest)對象。這個對象存儲了請求過來的全部信息,包括攜帶的參數以及一些頭部信息等。在視圖中,通常是完成邏輯相關的操做。好比這個請求是添加一篇博客,那麼能夠經過request來接收到這些數據,而後存儲到數據庫中,最後再把執行的結果返回給瀏覽器。

②視圖函數的返回結果必須是django.http.response.HttpResponseBase對象或者子類的對象。示例代碼以下:

from django.http import HttpResponse  # 導入對象
def book_list(request):  # ①第一個參數永遠都是request。
    return HttpResponse("書籍列表!")  # ②返回值爲HttpResponseBase對象或者子類的對象。

當想了解HttpResponse時,能夠ctrl+b。

2,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)
]

注意點:

①爲何會去urls.py文件中尋找映射呢?

    是由於在 'settings.py' 文件中配置了 'ROOT_URLCONF' 爲 'urls.py' 。全部的django會去 'urls.py' 中去尋找。

②在 'urls.py' 中咱們全部的映射,都應該放在 'urlpatterns' 這個變量中。

③全部的映射不是隨便寫的,而是使用 'path' 函數或者 're_path' 函數進行包裝的。

3,URL中添加參數(兩種)

①採用在url中使用變量的方式

好比簡書的文章詳情頁面的url就能夠寫成https://www.jianshu.com/p/<id>,其中id就是文章的id。實現:在path的第一個參數中,使用<參數名>的方式能夠傳遞參數。而後在視圖函數中也要寫一個參數,視圖函數中的參數必須和url中的參數名稱保持一致,否則就找不到這個參數。另外,url中能夠傳遞多個參數。

url.py

from django.contrib import admin
from django.urls import path
from book import views
from django.http import HttpResponse

def index(request):
    return HttpResponse('首頁')

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',index),
    path('book/',views.book),
    path('book/detail/<book_id>/<category_id>',views.book_detail),
]

views.py

def book_detail(request,book_id):    # 傳遞一個參數
    #能夠從數據庫由根據book_id提取這個圖書的信息。
    text = "您獲取的圖書id是:%s" % book_id
    return HttpResponse(text)

def book_detail(request,book_id,category_id):  # 傳遞多個參數
    #能夠從數據庫由根據book_id提取這個圖書的信息。
    text = "您獲取的圖書id是:%s,圖書分類是%s" % (book_id, category_id)
    return HttpResponse(text)

②採用查詢字符串的方式

在url中,不須要單獨的匹配查詢字符串的部分。只須要在視圖函數中使用request.GET.get('參數名稱')的方式來獲取。示例代碼以下:

urls.py

path('book/author/',views.author_detail)

views.py

def author_detail(request):
    author_id = request.GET.get('id')  # author_id = request.GET['id']
    text = '做者的id是:%s' % author_id
    return HttpResponse(text)

由於查詢字符串使用的是GET請求,因此咱們經過request.GET來獲取參數。而且由於GET是一個相似於字典的數據類型,全部獲取值跟字典的方式都是同樣的。之後在訪問的時候就是經過/book/detail/?id=1便可將參數傳遞過去。

4,url參數的內置轉換器:

自定義轉換器詳見本文後面。

在url中使用變量,添加參數,爲了限定該變量的類型,故採用轉換器來限定。

from django.urls import converters  # 導入轉換器,選中converters,ctrl+b查看源碼

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/publisher/<int:publisher_id>',views.publisher_detail)  # 若不標明轉換器,默認str轉換器
]

str:除了斜槓/之外全部的字符都是能夠的。

int:只有是一個或者多個的阿拉伯數字。

path:全部的字符都是知足的。

uuid:只有知足uuid.uuid4()這個函數返回的字符串的格式。能夠做爲數據庫表中的主鍵。

slug:英文中的橫杆或者英文字符或者阿拉伯數字或者下劃線才知足。

5,URL中包含另一個urls模塊

 在咱們的項目中,不可能只有一個app,若是把全部的app的views中的視圖都放在urls.py中進行映射,確定會讓代碼顯得很是亂。所以django給咱們提供了一個方法,能夠在app內部包含本身的url匹配規則,而在項目的urls.py中再統一包含這個app的urls。

①應該使用`include`函數包含子`urls.py`,而且這個`urls.py`的路徑是相對於項目的路徑。示例代碼以下:

# first_project/urls.py文件:

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/',include("book.urls"))  # include下的路徑相對於項目而言
]

 ②在urls.py文件中把全部的和book這個app相關的url都移動到app/urls.py中了,而後在first_project/urls.py中,經過include函數包含book.urls,之後在請求book相關的url的時候都須要加一個book的前綴。

# book/urls.py文件:

from django.urls import path
from . import views

urlpatterns = [
    path('',views.book),
    path('detail/<book_id>',views.book_detail),
    path('list/',views.book_list),
]

 ③`url`是會根據主`urls.py`和app中的`urls.py`進行拼接的,所以注意不要多加斜槓。之後訪問書的列表的url的時候,就經過/book/list/來訪問,訪問書籍詳情頁面的url的時候就經過book/detail/<id>來訪問。

6,url命名與反轉url

①爲何須要url命名?

由於url是常常變化的。若是在代碼中寫死可能會常常改代碼。給url取個名字,之後使用url的時候就使用他的名字進行反轉就能夠了,就不須要寫死url了。

②如何給一個url指定名稱?

在path函數中,傳遞一個name參數就能夠指定。示例代碼以下:

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

③應用命名空間:

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

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

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

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

# reverse 將path中的視圖函數轉換爲url,提早是須要給url指定一個名字
# redirect 重定向函數
login_url = reverse('front:login') return redirect(login_url) # return redirect(reverse('front:login'))

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

避免一個app同時映射多個url,產生錯誤的問題。

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

urlpatterns = [
    path('',include('front.urls')),
    # 同一個app下有兩個實例
    path('cms1/',include('cms.urls',namespace='cms1')),
    path('cms2/',include('cms.urls',namespace='cms2')),
]

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

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))  # 這裏使用獲得的namespace

front:用來管理前臺相關的代碼的

cms:用來管理後臺相關的代碼的

指定

# cms.urls.py 文件

from django.urls import path from . import views app_name = 'cms' urlpatterns = [ path('',views.index,name = 'index'), path('login/',views.login,name = 'login') ] # cms.views.py 文件

from django.http import HttpResponse from django.shortcuts import redirect,reverse 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))  # 這裏使用獲得的namespace

def login(request): return HttpResponse('CMS登陸頁面') # front.urls.py 文件

from django.urls import path from . import views app_name = 'front' urlpatterns = [ path('',views.index,name = 'index'), path('signin/',views.login,name='login') ] # front.views.py 文件

from django.http import HttpResponse from django.shortcuts import redirect,reverse def index(request): # ?username = xxx
    username = request.GET.get('username') if username: return HttpResponse('前臺首頁') else: return redirect(reverse('front:login')) def login(request): return HttpResponse('前臺登陸頁面') # urls.py 文件

from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('',include('front.urls')), path('cms1/', include('cms.urls',namespace='cms1')), path('cms2/', include('cms.urls',namespace='cms2')),
示例

若是指定實例命名空間,那麼前提必需要先指定應用命名空間。也就是在子`urls.py`中添加`app_name`變量。

7,path函數

path函數的定義爲:path(route,view,name=None,kwargs=None)。如下對這幾個參數進行講解。

①route參數

url的匹配規則。這個參數中能夠指定url中須要傳遞的參數,好比在訪問文章詳情頁的時候,能夠傳遞一個id。傳遞參數是經過<>尖括號來進行指定的。而且在傳遞參數的時候,能夠指定這個參數的數據類型,好比文章的id都是int類型,那麼能夠這樣寫<int:id>,之後匹配的時候,就只會匹配到id爲int類型的url,而不會匹配其餘的url,而且在視圖函數中獲取這個參數的時候,就已經被轉換成一個int類型了。其中還有幾種經常使用的類型:

str:非空的字符串類型。默認的轉換器。可是不能包含斜槓。

int:匹配任意的零或者正數的整形。到視圖函數中就是一個int類型。
slug:由英文中的橫槓-,或者下劃線_鏈接英文字符或者數字而成的字符串。

uuid:匹配uuid字符串。

path:匹配非空的英文字符串,能夠包含斜槓。

②view參數:

能夠爲一個視圖函數或者是類視圖.as_view()或者是django.urls.include()函數的返回值。

③name參數:

這個參數是給這個url取個名字的,這在項目比較大,url比較多的時候用處很大。

④kwargs參數:

有時候想給視圖函數傳遞一些額外的參數,就能夠經過kwargs參數進行傳遞。這個參數接收一個字典。傳到視圖函數中的時候,會做爲一個關鍵字參數傳過去。好比如下的url規則:

from django.urls import path
 from . import views

 urlpatterns = [
     path('blog/<int:year>/', views.year_archive, {'foo': 'bar'}),
 ]

那麼之後在訪問blog/1991/這個url的時候,會將foo=bar做爲關鍵字參數傳給year_archive函數。

⑤re_path函數

有時候咱們在寫url匹配的時候,想要寫使用正則表達式來實現一些複雜的需求,那麼這時候咱們可使用re_path來實現。⑴re_path的參數和path參數如出一轍,只不過第一個參數也就是route參數re_path在寫url的時候能夠用正則表達式,功能更增強大。

⑵全部的route字符串前面都加了一個r,表示這個字符串是一個原生字符串。在寫正則表達式中是推薦使用原生字符串的,這樣能夠避免在python這一層面進行轉義。並且,使用正則表達式捕獲參數的時候,是用一個圓括號進行包裹,而後這個參數的名字是經過尖括號<year>進行包裹,以後纔是寫正則表達式的語法。
一些使用re_path的示例代碼以下:

# article.urls.py 文件
from django.urls import re_path
from . import views

urlpatterns = [
        # r"": 表明的是原生字符串(raw)
        # ^"": 以什麼開頭
        # $"": 以什麼結尾
        # (): 在正則表達式裏面定義一個須要捕獲的參數,則使用()包裹起來
        # ?P: 給捕獲的變量取名字,寫在?P後面
        # <>: 代表這個名字叫作什麼名字
        # \d: 表明0-9之間的數字,若是須要四個,則寫成\d{4}
    re_path(r'^$',views.article),
        # 定義一個須要捕獲的參數取名爲year,後面爲四個數字,並以/結尾
    re_path(r'^list/(?P<year>\d{4})/$',views.article_list), 
    re_path(r'^list/(?P<month>\d{2})/$',views.article_list_month), ]

article.views.py文件

from django.http import HttpResponse def article(request): return HttpResponse('文章首頁') def article_list(request,year): text = '您輸入的年份是:%s' % year return HttpResponse(text) def article_list_month(request,month): text = '您輸入的月份是:%s' % month return HttpResponse(text) # urls.py文件
from django.urls import path,include urlpatterns = [ path('article/',include('article.urls')) ]
article.views.py文件

按住alt+1能夠實現項目(project)欄的打開和關閉

⑥include函數

在項目變大之後,常常不會把全部的url匹配規則都放在項目的urls.py文件中,而是每一個app都有本身的urls.py文件,在這個文件中存儲的都是當前這個app的全部url匹配規則。而後再統一註冊到項目的urls.py文件中。include函數有多種用法,這裏講下兩種的用法。

①include(module,namespace=None):直接把其餘app的urls包含進來。

module:子url的模塊字符串。

namespace:實例命名空間。這個地方須要注意一點。若是指定實例命名空間,那麼前提必需要先指定應用命名空間。也就是在子`urls.py`中添加`app_name`變量。

示例代碼以下:

# movie.urls.py 文件
from django.contrib import admin from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('book/',include("book.urls")) ]

固然也能夠傳遞namespace參數來指定一個實例命名空間,可是在使用實例命名空間以前,必須先指定一個應用命名空間。示例代碼以下:

# 主urls.py文件:
from django.urls import path,include
urlpatterns = [
    path('movie/',include('movie.urls',namespace='movie'))
]

而後在movie/urls.py中指定應用命名空間。實例代碼以下:

from django.urls import path
from . import views

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

urlpatterns = [
    path('',views.movie,name='index'),
    path('list/',views.movie_list,name='list'),
]

②include(pattern_list):能夠包含一個列表或者一個元組,這個元組或者列表中又包含的是path或者是re_path函數。

path('movie/',include([
        path('',views.movie),
        path('list/',views.movie_list),
    ]))

③include((pattern,app_namespace),namespace=None):在包含某個app的urls的時候,能夠指定命名空間,這樣作的目的是爲了防止不一樣的app下出現相同的url,這時候就能夠經過命名空間進行區分。`include`函數的第一個參數既能夠爲一個字符串,也能夠爲一個元組,若是是元組,那麼元組的第一個參數是子`urls.py`模塊的字符串,元組的第二個參數是應用命名空間。也就是說,應用命名空間既能夠在子`urls.py`中經過`app_name`指定,也能夠在`include`函數中指定。示例代碼以下:

from django.contrib import admin
from django.urls import path,include

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

可是這樣作的前提是已經包含了應用命名空間。即在myapp.urls.py中添加一個和urlpatterns同級別的變量app_name。

⑦URL映射指定默認參數:

使用path或者是re_path的後,在route中均可以包含參數,而有時候想指定默認的參數,這時候能夠經過如下方式來完成。示例代碼以下:

from django.urls import path
from . import views

urlpatterns = [
    path('books/', views.books),
    path('books/page/<int:page>/', views.books),
]

# views (in views.py)
book_list = [
    '三國演義',
    '水滸傳',
    '西遊記',
    '紅樓夢'
]
def books(request, page=0):

當在訪問books/的時候,由於沒有傳遞page參數,因此會匹配到第一個url,這時候就執行view.books這個視圖函數,而在books函數中,又有page=1這個默認參數。所以這時候就能夠不用傳遞參數。而若是訪問book_list/0的時候,由於在傳遞參數的時候傳遞了page,所以會匹配到第二個url,這時候也會執行views.books,而後把傳遞進來的參數傳給books函數中的page。

⑧url反轉reverse:

以前咱們都是經過url來訪問視圖函數。有時候咱們知道這個視圖函數,可是想反轉回他的url。這時候就能夠經過reverse來實現。示例代碼以下:

reverse("list")
> /book/list/

若是有應用命名空間或者有實例命名空間,那麼應該在反轉的時候加上命名空間。示例代碼以下:

reverse('book:list')
> /book/list/

若是這個url中須要傳遞參數,那麼能夠經過kwargs來傳遞參數。示例代碼以下:

reverse("book:detail",kwargs={"book_id":book_id})
> /book/detail/...

由於django中的reverse反轉url的時候不區分GET請求和POST請求,所以不能在反轉的時候添加查詢字符串的參數。若是想要添加查詢字符串的參數,只能手動的添加。示例代碼以下:

login_url = reverse('login') + "?next=/"

示例代碼:

# front.veiws.py文件

from django.http import HttpResponse from django.shortcuts import reverse,redirect def index(request): username = request.GET.get('username') if username: return HttpResponse("首頁") else: # login_url = reverse('login') # 反轉
        # return redirect(login_url) # 跳轉

        # return redirect(reverse('login'))

        # kwargs:keyword arguments關鍵字參數
        return redirect(reverse('detail',kwargs={'article_id:1'})) # 若是遇見/login/?next=xxx,只能手動添加。
        # return redirect(reverse('login') + '?next=/')

def login(request): return HttpResponse('登陸頁面') def article_detail(request,article_id): text = '您的文章id是:%s' % article_id return HttpResponse(text) # urls.py文件

from django.urls import path from front import views urlpatterns = [ path('',views.index,name = 'index'), path('login/',views.login,name = 'login'), path('detail/<article_id>',views.article_detail,name = 'detail'), ]
front.veiws.py文件+urls.py文件

⑨自定義URL(PATH)轉換器:

以前已經學到過一些django內置的url轉換器(python內置轉換器見2.4),包括有int、uuid等。有時候這些內置的url轉換器並不能知足咱們的需求,所以django給咱們提供了一個接口可讓咱們本身定義本身的url轉換器。

自定義url轉換器按照如下五個步驟來走就能夠了:

①定義一個類,直接繼承自object就能夠了。
②在類中定義一個屬性regex,這個屬性是用來限制url轉換器規則的正則表達式。
③實現to_python(self,value)方法,這個方法是將url中的值轉換一下,而後傳給視圖函數的。
④實現to_url(self,value)方法,這個方法是在作url反轉的時候,將傳進來的參數轉換後拼接成一個正確的url。
⑤ 將定義好的轉換器,使用`django.urls.converters.register_converter`方法註冊到django中。

好比寫一個匹配四個數字年份的url轉換器。示例代碼以下:

# article.converters.py文件

from django.urls import converters,register_converter

# 創建轉換規則
class CateforyConverter(object):
    regex = r'\w+|(\w+\+\w+)+'

    def to_python(self,value):
        # python+django+flask  →
        # ['python', 'django', 'flask']
        result = value.split('+')
        return result

    def to_url(self,value):
        # ['python', 'django', 'flask']  →
        # python+django+flask
        if isinstance(value,list):
            result = '+'.join(value)
            return result
        else:
            raise RuntimeError('轉換url的時候,分類必須爲列表!')

register_converter(CateforyConverter,'cate')  # 進行註冊

其餘相關文件:

# article.urls.py 文件

from django.urls import re_path,path from . import views urlpatterns = [ path('',views.article), # \w:0-9,a-z,A-Z,_
    # \+:表示普通的加號,一個斜槓一個加。轉義成普通加號。
    # +:表示前面字符一個或者多個

    # re_path(r'list/(?P<categories>\w+|(\w+\+\w+)+)',views.article_list),
    path('list/<cate:categories>/',views.article_list,name = 'list'), path('detail/<int:article_id>',views.article_detail,name = 'detail') ] # article.veiws.py 文件

from django.http import HttpResponse from django.shortcuts import reverse def article(request): return HttpResponse('文章首頁') def article_list(request,categories): print(type(categories))  # 顯示爲列表類型
    print('categories:%s' %categories) print(reverse('list',kwargs={'categories':categories})) text = '您填寫的分類爲:%s' % categories return HttpResponse(text) def article_detail(request,article_id): reverse('detail',kwargs={'article_id':article_id}) print(type(article_id)) return HttpResponse('文章詳情') # urls.py文件

from django.urls import path,include urlpatterns = [ path('article/',include('article.urls')) ]
article.urls.py & article.veiws.py & urls.py

所展現示例需求:

## 需求:
實現一個獲取文章列表的demo,用戶能夠根據`/articles/文章分類/`的方式來獲取文章。其中文章分類採用的是`分類1+分類2+分類3...`的方式拼接的,而且若是隻有一個分類,那就不須要加號。示例以下: ``` # 1. 第一種:獲取python分類下的文章
/articles/python/
# 2. 第二種:獲取python和django分類下的文章
/articles/python+django/
# 3. 第三種:獲取python和django和flask分類下的文章
/articles/python+django+flask/ 以此類推... ``` 在「文章分類」參數傳到視圖函數以前要把這些分類分開來存儲到列表中。 好比參數是`python+django`,那麼傳到視圖函數的時候就要變成`['python','django']`。 之後在使用reverse反轉的時候,限制傳遞「文章分類」的參數應該是一個列表,而且要將這個列表變成`python+django`的形式。
展現示例需求

 同時須要在__init__文件中導入converters.py文件,使得converters.py載入運行

from . import converters

  

 

若需轉載,請下方評論區或者私信聯繫筆者。 ---Qiuma

相關文章
相關標籤/搜索