2016-11-21 5 views
0

私はDjangoを初めて使用しています(私は一般的にPythonを初めて使用しています)、私は現在、クラスベースのビューに関連する特定の問題に苦しんでいます。私はLaravelのPHPから来ています。そこでは、いわゆる "RESTfulなリソースコントローラ"があります。Djangoでのリソースビュー

Laravelに精通していない人は、「リソース」ごとに1つのコントローラ(またはDjangoでの表示)を使用することが考えられます。このコントローラ/ビューでは、扱っている場合は、これらの制御方法のための関連URLとHTTPメソッドは、(例えば、それぞれGET /photosGET /photos/1GET /photos/createPOST /photosGET /photos/1/editあるなどindex()show()create()store()edit()、などの方法を定義します写真付き)。 Laravelのルーティングでは、ただ一つの行Route::resource('photos', 'PhotoController')を宣言する必要があり、それらのURLは自動的に生成されます。詳細は、Laravel's docsを参照してください。

私はこのパターンが本当に好きです。私はこれをDjangoで使いたいと思います。

私が理解する限り、Djangoには本当にそのようなものはありません。 Djangoにはクラスベースのビューがありますが、それらはリソースを表しません。むしろ、あなたの 'index()'(PhotoListView)、あなたの 'show()'(PhotoDetailView)のビューなどのビューがあります。

私はこのパターンをDjangoでどのように実装すべきか分かりません。私が欲しいものが良いかどうかは分かりません。

調査した結果、私は使用であるかもしれないいくつかの情報が見つかりました:

http://watchitlater.com/blog/2010/02/django-restful-resources/
https://baxeico.wordpress.com/2014/06/25/put-and-delete-http-requests-with-django-and-jquery/

私は最初のリンクからカスタムViewクラスが実現かわからないんだけどをその株式ジャンゴ見ることができます」 (通常のDjango Viewは多かれ少なかれ同じことをやっているのですが)、私は二番目のリンクが私が望むものとまったく同じではないと思います。(正しく理解すれば、ミドルウェアは問題の解決策DjangoはDELETE/PUTリクエストで送信されたデータを要求に入れない)。

  • このように、特定のリソースのすべてのURLと一致するのURLconf内の1行を使用します:

    url(r'^photos/(.*)$', PhotoView.as_view())

    はこれに基づき、私は2つの潜在的な解決策を考案しましたas_view()カスタムView基本クラスの機能では、/photos,/photos/1/photos/1/editなどのURLのルーティングが正しいクラスメソッドに処理されます。欠点は、ルーティングをビューに配置して(正しい場所ではなく)、名前付きパターンをこの方法で使用して、コードの別の場所にあるURLを参照できないことです。それはLaravelでの作品の仕方に最も近い。各URLのためのURLconfで

  • 利用別々のライン、のように:

    url(r'^photos$', PhotoView.index) url(r'^photos/(\d+)$', PhotoView.show) url(r'^photos/(\d+)/edit$', PhotoView.edit)

    これの利点は、名前のパターンはいつものように動作することで、すべてのルーティングはURLconfの中にとどまります。しかし、私はどのようにViewクラスの実装の面でこれを達成するのかわかりません(私はすべてのメソッドを@classonlymethod、右に飾らなければならないでしょう)。

申し訳ありませんが、私はテキストの壁紙のために、これをどのように解決するかについてのご意見を喜んでお聞きします。あるいは、私はちょうど狂ったばかげただけで、私はちょうどすべての通常のDjangoコーダーのような関数ベースのビューを使うべきですか?

+1

あなたは[DjangoのRESTフレームワーク](http://www.django-rest-framework.org/)を見たことがありますか? –

+0

@JensAstrupはい、私は(繰り返し)それに遭遇しました。私はAPIを構築するのではなく、Webサイト/ Webアプリケーションを構築しています。 – Compizfox

答えて

0

質問に2つの提案されたソリューションを多少組み合わせたカスタムクラスベースのビューを作成しました。

一般的な考え方は、私は(それがas_view()dispatch()メソッドを持っている)DjangoのViewクラスと同じ構造を次のResourceViewを持っているということです。 DjangoのViewと同様に、as_view()は、内部のクロージャーを定義し、その内部はURLconfに返されます。この閉鎖は、正しい(子)メソッドに要求をディスパッチするためにdispatch()に依存します。このため、ルート(URL)とHTTPメソッドの組み合わせに対してどのメソッドを呼び出すべきかを判断するために、 '2d map'(dictsのdict)を使用します。 DjangoのViewとの違いは、as_view()がルートを指定するパラメータとともにURLconfで呼び出されるということです。

また、ビューに対応するURLconfを自動的に生成するResourceRouterがあります。このアプローチは、DRFがこれをどのように処理するかにある程度触発されています。

最後に、モデルインスタンスをメソッドにバインドするデコレータを書いたので、pkの代わりにモデルインスタンスがviewメソッドに渡されます。

コードはここで見つけることができます:https://gist.github.com/Compizfox/c4e3044755417f59dc33ce97ac8ca07c

1

コメントでJensが提案しています。サードパーティのDjango Rest Frameworkは、あなたが記述したララベルコントローラにもっとも近いものです。見るべき特定の項目はviewsetsです。

Django RESTフレームワークを使用すると、 関連ビューセットのロジックを、ViewSetと呼ばれる1つのクラスにまとめることができます。他のフレームワークでは、 のように、 'Resources'や 'Controllers'のような概念的に似た実装、 という名前のものもあります。

DRFの学習曲線は非常に急峻です。 DRFはまた、APIの作成にしか適していないという印象を与えています。しかし、実際には、DRFをrender HTML and process ordinary HTML formsに使用することができます。

RESTフレームワークは、APIスタイルの応答と通常のHTMLページの両方を返すのに適しています。さらに、シリアライザをHTMLフォーム として使用し、テンプレートでレンダリングすることもできます。

もちろん、クラスベースのビューを使用することもできます。欠点は、単一のクラスにDRFビューセットのすべての機能を提供していないことです。しかし、すべてが失われません。 CBV Mixinsを使用して、必要な機能をミックスして一致させることができます。

+0

ありがとうございます。私は実際にはAPIのためのものであって、ウェブサイトのものではないという印象を得ました。 DRFは私が探しているようだが、私が望むことを実行し、DRFよりもはるかに簡単なカスタムView基本クラスを作成しましたが(柔軟ではありませんが)、全く新しいフレームワーク。私はそれが終了したときに答えとして投稿します。 – Compizfox

+0

計画のように聞こえますが、最初からビュークラスを作成する必要はありません。上記のようにミックスをマッチさせて一致させることができます。少しだけコードを書く必要があります。 – e4c5

+0

あまりにも遅く、 ...;)私はこれらのミックスインを使ってリファクタリングできるかどうか確認します。先端に感謝します。 – Compizfox

関連する問題