1. 程式人生 > >Django基於類的編輯檢視和Mixins

Django基於類的編輯檢視和Mixins

== 內建的基於類的通用編輯檢視 (Forms)

表單(處理)通常包含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是主要的類檢視,所有的類檢視都是繼承自他。如果我們寫自己的類檢視,也可以繼承自他。然後再根