[解決済み] Class-Based ビューの利点は何ですか?
質問
今日、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 つの処理ユニットにダンプされます。
関連
-
Djangoは、フォームを送信するときに403エラーに遭遇しました。CSRF 検証に失敗しました。
-
Django の ForeignKey パラメータの使用法
-
[解決済み] FastCGIとDjangoを使用しているnginxのエラーログはどこで見ることができますか?
-
[解決済み] 保存時に、フィールドが変更されたかどうかを確認するにはどうすればよいですか?
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
-
[解決済み] シグナルハンドラは django プロジェクトのどこにあるべきですか?
-
[解決済み] django で複数のオブジェクトを削除する
-
[解決済み] Django テンプレート url タグに url パラメータを追加する方法は?
-
[解決済み] Djangoのデータベースクエリ。id でオブジェクトを取得するには?
-
[解決済み] Django で https 接続を非 https 接続と同じように簡単にテストするには 'runserver' を使うには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
6.5、Django - モデルでJSONFieldを使用してJSONフィールドでMySQLテーブルを作成する
-
[解決済み】Djangoでモデルインスタンスをシリアライズする方法は?
-
[解決済み] Django ORM のクエリセットに対応する SQL クエリを表示するには?
-
[解決済み] Django は静的ファイルの URL をビューで取得します。
-
[解決済み] Djangoのvalues()の項目名を変更する方法は?
-
[解決済み] Django でモデルのフィールドを取得する
-
[解決済み] Django Forms: 有効でない場合、エラーメッセージとともにフォームを表示する
-
[解決済み] Djangoテンプレートでネストされたforループで一番外側のforloop.counterにアクセスする方法は?
-
[解決済み] Django の DoesNotExist 例外はどのようにインポートしますか?
-
[解決済み] django のユニットテストを複数のファイルに分散させるには?