1. 程式人生 > >django-3-檢視(views.py)與網址(urls.py)

django-3-檢視(views.py)與網址(urls.py)

檢視與網址

操作檔案:urls.py、views.py

urls.py

  作用:用於處理前臺的連結(如前臺訪問:127.0.0.1:8080/index/1212/21212),其實永遠訪問的是同一個檔案,至於結果則是通過urls處理,呼叫不同views中的不同函式,當然這些函式可以在urls中指定。

  主要格式:

      1.7:url(r'^add/$''calc.views.add', name='add'),

      1.8:url(r'^add/$', views.add, name='add'),

      2.0: path('add/'

, views.add, name='add'),

  注意:1.8和2.0需要將views匯入到urls中,如 from app import views

  額外:可以在app中新建urls,通過include函式(2.0:from django.urls import include)使其有效(path('app/', include('app.urls')),)

  值得一提的是,每個路由都有一個name(如上:name="add")可寫可不寫,這裡雖不是必須但也極其重要,他是前臺連結的別名,即模板中可以使用這個name的值作為路由,需要和{% url %}一起使用。這樣寫的好處是,程式碼可維護性很高。

views.py

  上面提到需要在urls中引入views模組,如:views.add,其實是在呼叫views中的add方法,這個方法很特殊,必須至少一個引數,而第一個引數作為資料請求的控制代碼,也就是request,在裡面可以獲取前端發來的請求,而且必須返回一個HttpResponse物件。

  作用:用於處理請求、資料庫互動、模板呼叫等(內容很多)。

  呼叫模板(templates): 在views 的函式中最後加上return render(request, 'home.html')home.html即為模板名稱,相應的在tempalates中必須有home.html檔案,並且需要設定settings.py中的TEMPLATES變數,設定DIRS:'DIRS': [os.path.join(BASE_DIR,'Templates')],

關於FBV與CBV

  FBV:f即為function

    通過在views.py檔案中(其他檔案也行,只要urls.py檔案能訪問並呼叫該函式,且最終return HttpResponse(),即可)定義函式,(如def index(request):),而在urls.py中可通過 path('index/', views.index, name='index')呼叫index方法,這就是FBV。

  那麼CBV又是什麼呢?

    C即為class,通過類呼叫,這個類是一個很特殊的類。

    1、需要繼承View類

        

views.py---------------------------------------------------------------

from django.views.import View 
class A(View):

    def  get(self,request):

    return HttpResponse()
    
    def post(self,request):

            return HttpResponse()


urls.py------------------------------------------------------------------

path('A/', views.A.as_view()),

#注意,是views.A.as_view()
#解釋如下:
通過views.A.as_view(),django會根據method的值會自動呼叫get或者post,當然還有其他方法,一共八種,當然from表單只能使用get或者post

CBV擴充套件

    django是如何呼叫get和post方法的呢?

    其實是通過Views下的dispatch方法來呼叫的。

    因此,重寫dispath方法,來額外編寫在客戶端請求get或者post之前,需要做的工作。比如:使用者驗證等

    

from django.views.import View 
class A(View):

    def  get(self,request):

    return HttpResponse()
    
    def post(self,request):

            return HttpResponse()

    
    def dispatch(self,request,*args,**kwargs):

            result = super(A,self).dispatch(request,*args,**kwargs)

            #在這裡編寫自己的判斷邏輯,比如:使用者登入驗證等內容

            return result