Django基於類的編輯檢視和Mixins
表單(處理)通常包含3條路徑:
* 初始的GET (空或預填充的表單)
* 非法資料的POST (通常重新顯示錶單並提示錯誤)
* 合法資料的POST (處理資料並通常重定向)
你自己實現這些常常需要重複很多模式化的程式碼。幫助避免這些,Django提供了一系列通用的基於類的檢視用於表單處理。
- 基本表單
# forms.py
from django import forms
class ContactForm(forms.Form):
name = forms.CharField()
message = forms.CharField(widget=forms.Textarea)
def send_email(self):
# send email using the self.cleaned_data dictionary
pass
# views.py
from myapp.forms import ContactForm
from django.views.generic.edit import FormView
class ContactView(FormView):
template_name = 'contact.html'
form_class = ContactForm
success_url = '/thanks/'
def form_valid(self, form):
# 當合法form資料被POST時,此方法被呼叫。
# 它應當返回一個HttpResponse.
form.send_email()
return super(ContactView, self).form_valid(form)
- Model表單
通用檢視將自動建立ModelForm, 依據下列規則:
* 如果給出model屬性,其model類將被使用
* 如果get_object()返回一個物件,此物件的類被使用
* 如果給出queryset,則queryset的model被使用
Model form檢視提供了一個form_valid()實現,自動儲存model物件。你可以根據自己的需要重寫它。
對於CreateView或UpdateView,你甚至不需要提供一個success_url, 它們將使用model物件的get_absolute_url(),如果可用。
如果你需要自定義ModelForm(例如,增加校驗),只需要在你的檢視(view)中設定form_class, *還必須設定model.
# models.py
from django.core.urlresolvers import reverse
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=200)
def get_absolute_url(self):
return reverse('author-detail', kwargs={'pk': self.pk})
# views.py
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy
from myapp.models import Author
class AuthorCreate(CreateView):
model = Author
fields = ['name']
class AuthorUpdate(UpdateView):
model = Author
fields = ['name']
class AuthorDelete(DeleteView):
model = Author
success_url = reverse_lazy('author-list')
# urls.py
from django.conf.urls import url
from myapp.views import AuthorCreate, AuthorUpdate, AuthorDelete
urlpatterns = [
url(r'author/add/$', AuthorCreate.as_view(), name='author-add'),
url(r'author/(?P<pk>[0-9]+)/$', AuthorUpdate.as_view(), name='author-update'),
url(r'author/(?P<pk>[0-9]+)/delete/$', AuthorDelete.as_view(), name='author-delete'),
]
- Models 和 request.user
為跟蹤使用CreateView建立某物件的使用者,你可以自定義一個ModelForm.
# models.py
class Author(models.Model):
name = models.CharField(max_length=200)
created_by = models.ForeignKey(User)
# views.py
class AuthorCreate(CreateView):
model = Author
fields = ['name']
def form_valid(self, form):
form.instance.created_by = self.request.user
return super(AuthorCreate, self).form_valid(form)
- AJAX 用例
from django.http import JsonResponse
from django.views.generic.edit import CreateView
from myapp.models import Author
class AjaxableResponseMixin(object):
"""
Mixin用於為form增加AJAX支援。
必須用於基於類的FormView(如,CreateView), 即用於編輯檢視
"""
def form_invalid(self, form):
response = super(AjaxableResponseMixin, self).form_invalid(form)
if self.request.is_ajax():
return JsonResponse(form.errors, status=400)
else:
return response
def form_valid(self, form):
# 我們需要確保呼叫父類的form_valid()方法,因為它可能會做一些處理
# (在CreateView的例子中,它將呼叫form.save())
response = super(AjaxableResponseMixin, self).form_valid(form)
if self.request.is_ajax():
data = {
'pk': self.object.pk,
}
return JsonResponse(data)
else:
return response
class AuthorCreate(AjaxableResponseMixin, CreateView):
model = Author
fields = ['name']
== 在基於類的檢視中使用Mixins
https://docs.djangoproject.com/en/1.8/ref/class-based-views/mixins/
- 內容及模板響應
TemplateResponseMixin
ContextMixin
- 構建Django的通用基於類的檢視
DetailView: working with a single Django object
#To get the object, DetailView relies on SingleObjectMixin
#To then make a TemplateResponse, DetailView uses SingleObjectTemplateResponseMixin
ListView: working with many Django objects
#To get the objects, ListView uses MultipleObjectMixin
#To make a TemplateResponse, ListView then uses MultipleObjectTemplateResponseMixin
- 使用Django的基於類檢視的Mixins
Using SingleObjectMixin with View
Using SingleObjectMixin with ListView
- 避免更復雜
Using FormMixin with DetailView
A better solution
An alternative better solution
- 不限於HTML
from django.http import JsonResponse
class JSONResponseMixin(object):
"""
A mixin that can be used to render a JSON response.
"""
def render_to_json_response(self, context, **response_kwargs):
"""
Returns a JSON response, transforming 'context' to make the payload.
"""
return JsonResponse(
self.get_data(context),
**response_kwargs
)
def get_data(self, context):
"""
Returns an object that will be serialized as JSON by json.dumps().
"""
# Note: This is *EXTREMELY* naive; in reality, you'll need
# to do much more complex handling to ensure that arbitrary
# objects -- such as Django model instances or querysets
# -- can be serialized as JSON.
return context
from django.views.generic import TemplateView
class JSONView(JSONResponseMixin, TemplateView):
def render_to_response(self, context, **response_kwargs):
return self.render_to_json_response(context, **response_kwargs)
相關推薦
Django基於類的編輯檢視和Mixins
== 內建的基於類的通用編輯檢視 (Forms) 表單(處理)通常包含3條路徑: * 初始的GET (空或預填充的表單) * 非法資料的POST (通常重新顯示錶單並提示錯誤) * 合法資料的POST (處理資料並通常重定向) 你自己實現這些常常需要重複很多模式化的程式碼。
django--基於類的檢視
Django 提供基本的檢視類,它們適用於絕大多數的應用。所有的檢視類繼承自View 類,它負責將檢視連線到URL、HTTP 方法排程和其它簡單的功能。 在urlconf中的簡單用法: 使用通用檢視最簡單的方法是直接在URLconf 中建立它們。如果你只是修改基於類的檢
Django-深度分析Django基於類的檢視(1)(翻譯)
時間有限,只能簡單翻譯,略去一些無關緊要的細節。 本文是基於Django1.5版的,但是原理分析依舊非常有意義。 什麼是基於類的檢視?(CBV) Django類也就是Python類。一個Django檢視就是就是用來處理HTTP請求並返回HTTP響應的一段程式碼。不多不少
學習筆記-Python-Django-session、paginator、基於類的檢視、admin
# session - 為了應對HTTP協議的無狀態性 - 用來儲存使用者比較敏感的資訊 - 屬於request的一個屬性 - 常用操作: - request.session.get(key, defaultValue) - request.se
Django編寫RESTful API(三):基於類的檢視
歡迎訪問我的個人網站:www.comingnext.cn 前言 在上一篇文章中,主要講的是請求和響應,專案裡面views.py中的檢視函式都是基於函式的,並且我們介紹了@api_view這個很有用的裝飾器。同時,我們還介紹了APIView這個類,但是還沒使用它。在這篇文章中
Django 中針對基於類的檢視新增 csrf_exempt
在Django中對於基於函式的檢視我們可以 @csrf_exempt 註解來標識一個檢視可以被跨域訪問。那麼對於基於類的檢視,我們應該怎麼辦呢? 簡單來說可以有兩種訪問來解決 方法一:在類的 d
Django REST framework教程三: 基於類的檢視
教程索引目錄 Django REST framework的系列教程 對於需要通篇瞭解的同學,可以點選教程索引目錄。 其實,與其使用基於方法(function based)的檢視,我們更加傾向使用基於類(class based)的檢視。接下來,你將看到這
django-基於類登入
from django.views.generic.base import View class LoginView(View): def get(self, request): return render(request, 'login.html', {}) de
基於類的繼承和基於原型的繼承相比較,各有什麼優劣
1、兩者的聯絡和區別(優缺點),關於原型繼承: (1)原型繼承在有別於類繼承是因為繼承不在物件本身,而在物件的原型上(prototype); (2)每一個物件都有原型,在瀏覽器中它體現在一個隱藏的__proto__屬性上; (3)在一些現代瀏覽器中可以更改它們:比如在zepto中,就
Django2基於類的檢視詳解
一、基本檢視 view TemplateView RedirectView 二、通用顯示檢視 DetailView ListView 三、通用編輯檢視
解決NetBeans程式碼編輯檢視和左邊的專案檔案同步定位的問題
這個問題困擾了我很久,我非常喜歡這個編輯器,但就是不喜歡每次在右邊這個程式碼編輯檢視的時候,左邊的檢視也相應定位到它的位置,就是跟著一起動,擾亂了我。 解決方法:選單欄上的 檢視-&
Django - 基於forms組件和Ajax實現註冊登錄 - FileField字段 - Media配置
ron efault require result 基於 找到 parent 檢驗 body 一.基於forms組件的註冊頁面設計 點擊頭像==點擊input 頭像預覽: 修改 獲取用戶選中的文件對象;獲取文件對象的路徑;修改img標簽
Django 1.6 基於類的通用檢視
最初 django 的檢視都是用函式實現的,後來開發出一些通用檢視函式,以取代某些常見的重複性程式碼。通用檢視就像是一些封裝好的處理器,使用它們的時候只須要給出特定的引數集即可,不必關心具體的實現。各種通用檢視的參考參見:https://docs.djangoproject.com/en/1.6/ref/c
Django-restframework04 基於類檢視的檢視函式
1. 基於類的檢視函式(views.py) from snippets.models import Snippet from snippets.serializers import SnippetSerializer from django.http im
Django基於Form之登錄和註冊
cep 包含 註冊 try errors default elif eight django 1、創建Forms文件,內容略多,大家將就著看,不懂請留言 1 #!/usr/bin/env python 2 # -*- coding: utf8 -*-
Django Rest Framework 檢視和路由
一、DRF的檢視 (一)APIView APIView是REST framework提供的所有檢視的基類,繼承自Django的View父類。 APIView與View的不同之處在於: 傳入到檢視方法中的是REST framework的Request物件,而不是Django的HttpRequese
Django的View(檢視)和路由系統
一、Django的View(檢視) 1、介紹 一個檢視函式(類),簡稱檢視,是一個簡單的Python 函式(類),它接受Web請求並且返回Web響應。 響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文件,或者一張圖片。 無論檢視本身包含什麼邏輯,都要返回響應。 程式碼
Django API、檢視和模板、Django投票系統
一、Django API 1.1 使用python shell 1.1.1 載入python shell 1. 使用如下命令來呼叫Python shell: (django_env) [[email protected]
Django 1.8_檢視和URL配置
前情提要 學習瞭如何建立django專案,執行開發django伺服器,並瞭解了mvc模式。 內容 VIEW URL 正則表示式 錯誤解析與尋求幫助 hello world.html dynamic_date.html dynamic_da
Django 中類檢視詳解
在寫檢視的時候,Django除了使用函式作為檢視,也可以使用類作為檢視。使用類檢視可以使用類的一些特性,比如繼承等。 View檢視: django.views.generic.base.View是主要的類檢視,所有的類檢視都是繼承自他。如果我們寫自己的類檢視,也可以繼承自他。然後再根