効果的なDjango。 パート2







Effectivedjango.comからのDjango記事の翻訳の継続。 このフレームワークを勉強しているときにこのサイトに出会いました。 このリソースに投稿された情報は役に立つように思えましたが、ロシア語への翻訳がどこにも見つからなかったため、この善行を自分で行うことにしました。 この一連の記事は、Djangoを学習するための最初のステップのみを行うWeb開発者にとって役立つと思います。






目次



第3章プレゼンテーションの作成



3.1。 プレゼンテーションの基本



DjangoビューはHTTPリクエストを受信し、ユーザーにHTTPレスポンスを返します。







呼び出されるPythonオブジェクトはすべてビューにできます。 唯一の厳しい必要な要件は、呼び出されるPythonオブジェクトがリクエストオブジェクトを最初の引数として受け入れる必要があることです(通常、このパラメーターはrequest



と呼ばれます)。 これは、最小表現が非常に単純であることを意味します。



 from django.http import HttpResponse def hello_world(request): return HttpResponse("Hello, World")
      
      





もちろん、他のほとんどのフレームワークと同様に、DjangoではURLを介してビューに引数を渡すことができます。 これについては、アプリケーションを構築するときに説明します。



3.2。 一般ビューとクラスビュー





Django 1.3では、この章で焦点を当てるクラスビューを紹介しています。 クラスビュー、またはCBVは、ビュー、特にGETおよびPOSTリクエストに対してさまざまなアクションを実行するものを編集するためのビューから、多くの定型コードを削除できます。 プレゼンテーションクラスを使用すると、機能をパーツにまとめることができます。 欠点は、このすべてのパワーがさらに複雑になることです。



3.3。 クラスビュー(CBV)



CBVとして実装される最小のビューは、 View



docクラスの継承者であり、サポートされているHTTPメソッドを実装します。 以下は、「Hello、World」の非常に小さな表現です。これは以前に記述しましたが、クラス表現として作成しました。



 from django.http import HttpResponse from django.views.generic import View class MyView(View): def get(self, request, *args, **kwargs): return HttpResponse("Hello, World")
      
      





クラスビューでは、HTTPメソッド名がクラスメソッドにマップされます。 この例では、 get



classメソッドを使用してGETリクエストのハンドラーを定義しました。 関数によって実装される場合と同様に、このメソッドはリクエストオブジェクトを最初のパラメーターとして受け取り、HTTPレスポンスを返します。



注: 有効な署名

先ほど書いた表現、特に*args



**kwargs



比べて、関数シグネチャにいくつかの追加の引数があります。 CBVは、Djangoの「一般的な」ビューをより柔軟にするために最初に作成されました。 これらは、URLから抽出された潜在的に異なる引数を使用して、さまざまな異なるコンテキストで使用することを目的としていました。 過去1年間クラス表現を書いてきたので、有効な署名を使用してクラス表現を書き続けています。そのたびに、予期しない状況で役立つことがわかります。


3.4。 連絡先リストの表示



データベースの連絡先のリストを表示するビューから始めます。



ビューの基本的な実装は非常に短いです。 ほんの数行で記述できます。 これを行うには、 contacts



アプリケーションのviews.py



ファイルで、次のコードを入力します。



 from django.views.generic import ListView from contacts.models import Contact class ListContactView(ListView): model = Contact
      
      





ListView



を継承したListView



docクラス自体は、いくつかの動作を実装するいくつかの不純物で構成されています。 これにより、少量のコードで大きな力が得られます。 この例では、モデル( model = Contact



)を指定しました。これにより、このビューはデータベースからContact



モデルのすべての連絡先をリストます。



3.5。 URLの定義



URL構成(URLconf)は、リクエストアドレスでPythonコードを見つける方法をDjangoに指示します。 Djangoは、 urlpatterns



ファイルのurlpatterns



変数で定義されているURL構成をurlpatterns



ます。



addressbook/urls.py



ファイル内の連絡先のリストを表示するURLテンプレートをaddressbook/urls.py



追加しましょう。



 from django.conf.urls import patterns, include, url import contacts.views urlpatterns = patterns('', url(r'^$', contacts.views.ListContactView.as_view(), name='contacts-list',), )
      
      







urlpatterns



変数を定義urlpatterns



がありますurlpatterns



、Djangoでは、例外に対して他のいくつかの値( 変数 )を定義することもできます。 これらの値にはhandler403



handler404



handler403



含まれ、HTTPエラーの場合に使用するビューをDjangoに伝えます。 詳細については、 DjangoのURL設定ドキュメントを参照してください。



注:インポートURL構成エラー

Djangoは、起動時にURL設定を非常に早くロードし、内部にあるモジュールをインポートしようとします。 インポート操作の少なくとも1つが失敗した場合、エラーメッセージは少し理解できない場合があります。 インポートエラーが原因でプロジェクトがクラッシュする場合は、インタラクティブシェルでURL構成をインポートしてみてください。 これにより、ほとんどの場合、問題が発生した場所を特定できます。


3.6。 テンプレートを作成



連絡先リストビューのURLを定義したので、試してみましょう。 Djangoには、プロジェクトのテストに使用できる開発目的に適したサーバーが含まれています。



 (venv:tutorial)$ python ./manage.py runserver 0.0.0.0:8080 Validating models... 0 errors found November 04, 2014 - 15:25:05 Django version 1.6.7, using settings 'addressbook.settings' Starting development server at http://0.0.0.0:8080/ Quit the server with CONTROL-C.
      
      





ブラウザでhttp:// localhost:8080 /にアクセスしても、 TemplateDoesNotExists



エラーが発生します

翻訳者注:

サーバーが実行されているホストと同じホストからブラウザを起動する場合は、 localhost



指定します。
サーバーが別のホスト(私のものなど)で実行されている場合localhost



代わりにこのホストのIPアドレスを指定します(私の場合は192.168.1.51



)。




最も一般的なDjangoビュー(これには私たちが使用するListView



含まれます)には、事前に定義されたテンプレート名があります。 このエラーメッセージでは、ビューがモデル名から取得したcontact_list.html



というテンプレートファイルを見つけることを期待していたことがわかります。 そのようなテンプレートを作成しましょう。



デフォルトでは、Djangoはsettings.TEMPLATE_DIRS



指定されたディレクトリと同様に、アプリケーションでパターンを検索しsettings.TEMPLATE_DIRS



。 一般的なビューでは、テンプレートがアプリケーションディレクトリ(この場合、 contacts



ディレクトリ)にあることが期待され、ファイル名にはモデル名(この場合、予想されるファイル名: contact_list.html



)が含まれます。 これは、再利用するアプリケーションを開発するときに便利です。アプリケーションのユーザーは、デフォルトのテンプレートをオーバーライドする独自のテンプレートを作成でき、アプリケーションに直接関連付けられたディレクトリに保存されます。



翻訳者注:

Djangoは、テンプレートが_/templates/_/_



にあることを期待してい_/templates/_/_





ただし、この目的のために、ディレクトリ構造から追加のレイヤーを必要としないため、ビュークラスのtemplate_name



プロパティを使用してtemplate_name



明示的に定義します。 views.py



1行追加しviews.py







 from django.views.generic import ListView from contacts.models import Contact class ListContactView(ListView): model = Contact template_name = 'contact_list.html'
      
      





contacts



ディレクトリ(アプリケーションディレクトリ)にサブディレクトリtemplates



を作成し、その中にcontact_list.html



テンプレートファイルを作成します。



 <h1>Contacts</h1> <ul> {% for contact in object_list %} <li class="contact">{{ contact }}</li> {% endfor %} </ul>
      
      





http:// localhost:8080 /でブラウザを再度開く(または更新する)と、以前にインタラクティブシェルで作成した連絡先が少なくとも1つ表示されます。







3.7。 連絡先を作成する



対話型シェルを介してデータベースに情報を追加するには時間がかかりすぎるため、ビューを作成して新しい連絡先を追加しましょう。



連絡先リストの出力と同様に、一般的なDjangoビューの1つを使用します。 views.py



ファイルに、いくつかの行を追加します。



 from django.core.urlresolvers import reverse from django.views.generic import ListView from django.views.generic import CreateView from contacts.models import Contact class ListContactView(ListView): model = Contact template_name = 'contact_list.html' class CreateContactView(CreateView): model = Contact template_name = 'edit_contact.html' def get_success_url(self): return reverse('contacts-list')
      
      





翻訳者注:

Djangoバージョン> = 1.7を使用している場合、 CreateContactView



クラスに追加フィールドを追加できCreateContactView







  fields = ['first_name', 'last_name', 'email']
      
      





これは必須ではありませんが、Djangoバージョン1.7以降、フォームの自動生成を行うクラスこのフィールドを使用ないことは推奨されていません(テスト中に通知されます)。 指定しない場合、すべてのフィールドが編集フォームで使用されますが、この動作はDjango 1.8から削除されます。


フォームで機能するほとんどの一般的なビューには、「適切なURL」という概念があります。これは、フォームが正常に処理された後にユーザーがリダイレクトされるURLです。 フォームを処理するすべての送信は、変更を受け入れるためのPOST-redirect-GETプラクティスに準拠しているため、最終ページを更新してもフォームは再送信されません。 この概念をクラスのプロパティとして実装することも、 get_success_url()



メソッドをオーバーライドすることもできます。 この場合、 reverse



関数を使用して連絡先リストのURLを計算します。



注:クラスビューのコンテキスト変数

テンプレートが表示されるときにテンプレートで使用できる変数のセットは、 Contextと呼ばれます。 コンテキストは、ビューからのデータとコンテキストプロセッサからの情報の組み合わせです

組み込みの一般的なビューを使用する場合、コンテキストで使用できる変数は明確ではありません。 時間が経つにつれて、それらの名前(テンプレートコンテキストの一般的な表現によって提供される)がかなり一貫していることがobject_list



object



form



object



、およびobject_list



がよく使用されます)。 幸いなことに、これに関するドキュメントはDjango 1.5以降非常にきれいになりました。

クラスget_context_data()



メソッドを使用してコンテキストに情報を追加します。 このメソッドをオーバーロードする場合は、 **kwargs



を有効にしてスーパークラスを呼び出す必要があります。


連絡先の追加テンプレートは、連絡先リストのテンプレートよりも少し複雑ですが、あまり複雑ではありません。 contacts/templates/edit_contact.html



は次のようになります。



 <h1>Add Contact</h1> <form action="{% url "contacts-new" %}" method="POST"> {% csrf_token %} <ul> {{ form.as_ul }} </ul> <input id="save_contact" type="submit" value="Save" /> </form> <a href="{% url "contacts-list" %}">back to list</a>
      
      





注意すべきいくつかの新しい部分:




All Articles