Django 是最流行的網絡開發框架之一。它受歡迎的原因是它提供了許多內置功能,節省了開發人員的大量時間。如果你是初學者,那麼理解項目的流程需要一些時間。但是一旦你獲得了一些經驗,你就可以很容易地理解特性的執行。
Django 基於 MVT 模式,意思是模型視圖模板。我們主要使用兩種類型的視圖——基於函數的視圖和基於類的視圖。如果你是初學者,你必須意識到基於函數的視圖(FBV)。
當 Django 被引入時,它只支持基於函數的視圖,但是後來 Django 增加了基於類的視圖的概念。基於類的視圖減少了代碼的冗餘。它還支持 Django 的 DRY 概念。
在本教程中,我們將深入了解 FBV 和 CBC 之間的不同之處。我們可以使用基於函數的視圖和基於類的視圖來執行相同的任務。但是這兩種方法是不同的。
Django 觀點的要求
以下是我們應該記住的關於 Django 觀點的幾點。
- 視圖的第一個位置參數應該是
- 它應該返回 HttpResponse 對象,或者應該引發異常。
- Django 視圖是可調用的。我們既可以使用基於函數的方法,也可以使用基於類的方法。在使用 CBVs 時,我們繼承了方法 as_view() ,該方法使用 dispatch() 方法根據 HTTP 請求調用合適的方法。
讓我們詳細解釋一下創建視圖的方式。
基於函數的視圖
基於函數的視圖使用簡單,初學者很容易理解。它有助於理解 Django 基本面的核心概念。FBV 提供了從頭開始理解 django 概念的優勢。
Django 項目通常有 CRUD 操作,所以我們需要不必要地多次實現相同的代碼,這就是基於 Django 類的視圖出現在場景中的原因。創建基於類的視圖是為了解決代碼冗餘問題。讓我們了解一下 FBV 的利弊。
基於函數的視圖的優勢
FBV 的優勢如下。
- 易於實施、閱讀和理解
- 顯式代碼流
- 裝飾器很容易實現
- 適合一次性或專用功能
- 有助於理解 Django 的核心概念。
基於函數的視圖的缺點
FBV 的缺點如下。
- 代碼冗餘是 FBV 最關心的問題。
- 條件分支將用於處理 HTTP 請求。
- 很難擴展代碼。
讓我們理解 FBV 的以下實現。
代碼
def create_view(request, pk):
template_name = 'form.html'
form_class = MyForm
form = form_class
if request.method == 'POST':
form = form_class(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('list-view'))
return render(request, template_name, {'form': form})
基於類的視圖
基於類的視圖是在 Python 中創建視圖的先進方法。它在項目中實現為 Python 對象,而不是函數。它不是 FBV 的替代品,但它們提供了優於基於函數的視圖的優勢。它減少了代碼重複,並負責刪除和添加項目等基本操作。
對於初學者來說,獲得基於類的視圖的概念有點困難。你應該看一下文件,然後好好學習。如果你對基於函數的視圖有一個清晰的概念,你可以轉到基於類的視圖。
讓我們理解 Python 中視圖的以下優缺點。
基於類的視圖的優勢
下面是基於類的視圖的優點。
- CBV 最大的優勢之一就是繼承。CBV 允許我們繼承另一個類,並且可以針對不同的用例進行修改。
- 它支持 DRY 原則。它防止代碼的重複。在基於類的視圖中,代碼可重用性是可能的。
- 它帶有內置的基於泛型類的視圖。
- 基於類的視圖提供了正確的代碼結構。我們可以使用不同的類實例方法(而不是基於函數的視圖中的條件分支語句)來生成 HTTP 請求。
基於類的視圖的缺點
下面是基於類的視圖的缺點。
- 難以理解的複雜實現。
- 隱式代碼流。
- 視圖裝飾器需要額外的導入或方法覆蓋。
讓我們看看基於類的視圖的實現。
class MyCreateView(View):
template_name = 'form.html'
form_class = MyForm
def get(self, request, *args, **kwargs):
form = self.form_class
return render(request, template_name, {'form': form})
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST)
if form.is_valid():
form.save()
return HttpResonseRedirect(reverse('list-view'))
else:
return render(request, self.template_name, {'form': form})
我們調用 as_view()方法向用戶提供請求。as_view()方法調用 dispatch()方法來確定需要執行哪個類方法,具體取決於 HTTP 請求。我們可以通過以下方式實現它。
urlpatterns = [
url(new/', MyCreateView.as_view(), name='original-create-view'),
url(new_two/', MyCreateView.as_view(), name='modified-create-view')
]
當我們使用基於 Django 泛型類的視圖時,我們可以重寫像 get_formclass 和 get template _ names 這樣的幫助器方法。我們還可以在這些地方添加一些自定義邏輯,而不僅僅是覆蓋類屬性。
ModelFormMixin 就是最好的例子之一。用存儲在 self.object form_valid 方法中的更新值覆蓋 form_valid 方法。
Django 通用基於類的視圖
在基於泛型類的視圖的幫助下,我們可以執行一些重要的任務,如創建新對象、列表視圖、分頁、表單處理、歸檔視圖、刪除視圖等。
我們可以通過導入django . views . Generic .Generic 基於類的視圖來實現這一點,這是執行一些基本任務的好方法。它加快了開發過程。
Django 提供了一組 mixins 和通用的基於類的視圖。藉助這些工具,我們可以解決 web 開發中最常見的任務。
它節省了我們反覆編寫相同代碼的時間。在下面的例子中,我們可以修改我的創建視圖來繼承django . views . generic . createview。
from django.views.generic import CreateView
class FirstCreateView(CreateView):
model = MyModel
form_class = MyForm
我們可以觀察到,與以前的視圖相比,它需要非常少的代碼。django . views . generic . create view 帶有許多內置功能和快捷方式。讓我們再討論一些細節。
默認模板應該駐留在/ / form.html 中,我們可以通過設置類屬性**模板 名稱和模板 _ 名稱 _sufix** 進行修改。
- 在 CreateView 類中,我們需要指定模型名稱和 form_class_attributes。
- 我們還需要指定 successurl,它將在成功提交表單後重定向到上述頁面。可以使用**get absolute _ URL()完成。**
- 我們可以在視圖上指定字段的類屬性。下面是表單域的示例。
from django import forms
from . models import MyModel
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['name', 'description']
結論
這是開發人員之間的一個熱門爭論,即哪些視圖最好使用基於類或基於函數的視圖?我們已經討論了這兩種視圖的用途、缺點和優點。這完全取決於項目要求和你對什麼感到滿意。在某些情況下,基於類的視圖表現良好,在某些情況下,基於函數的視圖表現更好。
原創文章,作者:DFZ8J,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/130626.html