1. ホーム
  2. django

[解決済み] Class-Based ビューの利点は何ですか?

2023-06-08 18:04:31

質問

今日、Django 1.3 alpha が出荷され、最も注目されている新機能は クラスベースのビュー .

を読んだことがあります。 関連文書 を読みましたが、私は 大きな利点 を理解する手助けをお願いしたいのです。

では の高度な例を見てみましょう。 をドキュメントから引用してみましょう。

urls.py

from books.views import PublisherBookListView

urlpatterns = patterns('',
    (r'^books/(\w+)/$', PublisherBookListView.as_view()),
)

views.py

from django.shortcuts import get_object_or_404
from django.views.generic import ListView
from books.models import Book, Publisher

class PublisherBookListView(ListView):

    context_object_name = "book_list"
    template_name = "books/books_by_publisher.html",

    def get_queryset(self):
        self.publisher = get_object_or_404(Publisher, name__iexact=self.args[0])
        return Book.objects.filter(publisher=self.publisher)

    def get_context_data(self, **kwargs):
        # Call the base implementation first to get a context
        context = super(PublisherBookListView, self).get_context_data(**kwargs)
        # Add in the publisher
        context['publisher'] = self.publisher
        return context

そして次に、この問題のために私が5分で作った「古いビューの平易な」解決策と比較してみましょう(誤りを発見された場合はお詫びします)。

urls.py

urlpatterns = patterns('books.views',
    url(r'^books/(\w+)/$', 'publisher_books_list', name="publisher_books_list"),
)

views.py

from django.shortcuts import get_object_or_404
from books.models import Book, Publisher

def publisher_books_list(request, publisher_name):
    publisher = get_object_or_404(Publisher, name__iexact=publisher_name)
    book_list = Book.objects.filter(publisher=publisher)

    return render_to_response('books/books_by_publisher.html', {
        "book_list": book_list,
        "publisher": publisher,
    }, context_instance=RequestContext(request))

私には2番目のバージョンが見えます。

  • 機能的には同等
  • より読みやすい ( self.args[0] はひどい!)
  • より短い
  • DRY準拠に劣らない

私が見逃している何か大きなものがあるのでしょうか?なぜそれらを使用する必要があるのでしょうか?これらはドキュメントに記載されていますか?もしそうなら、理想的な使用例とは何でしょうか?また ミックスイン は便利ですか?

投稿してくださる方に感謝します。

P.S. 高度な機能を必要とするやいなや、普通のビューより短くなってしまったのです。

どのように解決するのですか?

クラスをサブクラス化し、get_context_dataのようなメソッドを特定のケース向けに改良し、残りはそのままにしておくことができます。関数ではそれができません。

たとえば、以前のビューが行うすべてのことを行う新しいビューを作成する必要があるかもしれませんが、コンテキストに余分な変数を含める必要があります。元のビューをサブクラス化し、get_context_dataメソッドをオーバーライドします。

また、テンプレートをレンダリングするために必要なステップを別々のメソッドに分離することは、より明確なコードを促進します - メソッド内で行われることが少ないほど、理解しやすくなります。メソッド内で行われることが少なければ少ないほど、理解しやすくなります。通常のビュー関数を使用すると、すべてが 1 つの処理ユニットにダンプされます。