
Effectivedjango.comからのDjango記事の翻訳の継続。 このフレームワークを勉強しているときにこのサイトに出会いました。 このリソースに投稿された情報は役に立つように思えましたが、ロシア語への翻訳がどこにも見つからなかったため、この善行を自分で行うことにしました。 この一連の記事は、Djangoを学習するための最初のステップのみを行うWeb開発者にとって役立つと思います。
目次
- はじめに
- 効果的なDjango。 ガイド
- 第1章はじめに
- 第2章モデルの使用
- 第3章パフォーマンスの作成
- 第4章静的リソースの使用
- 第5章高度な基本ビュー
- 第6章フォームの基本
- 第7章関連モデル
- 第8章認証および承認処理
- Djangoでのテスト
- ミドルウェアについて
- データベースとモデル
- クラスビュー(CBV)
- フォーム
第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。 一般ビューとクラスビュー
- 一般的な表現は常にいくつかの基本的な機能を提供します:テンプレートの視覚化 、リダイレクト、作成、モデルの編集など。
- バージョン1.3以降、一般的な表現のために、Django はクラス表現 (CBV)を導入しました 。
- 一般概念とCBVは、より高いレベルの抽象化と構成可能性を提供します。
- さらに、多くの複雑さを隠しており、そうでなければ初心者を混乱させる可能性があります。
- 幸いなことに、Djangoの新しいバージョンでは、これらすべてのドキュメントがより良くなりました。
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',), )
-
url()
関数を使用することは厳密に必須ではありませんが、使用することを好みます。URLパターンにさらに情報を追加し始めると、名前付きパラメーターを使用できるようになり、コードがきれいになります。 -
url()
受け入れられる最初のパラメーターは正規表現です。 末尾の$
文字に注意してください。 なぜそれが重要だと思いますか? - 2番目のパラメーターは、呼び出されたビューを示します。 これは、直接呼び出されるオブジェクト(手動でインポートされる)またはそれを記述する行のいずれかです。 これが文字列の場合、URLパターンがクエリ文字列と一致すると、Djangoは必要なモジュールを(最後のポイントまで)インポートし、行の最後のセグメント(最後のポイントの後)を呼び出します。
- クラス表現を使用するときは、このオブジェクトを記述する行ではなく、実際のオブジェクトを使用する必要があることに注意してください。
as_view()
クラスメソッドを呼び出すため、これを行う必要があります。 このメソッドは、Django URL Managerが呼び出すことができるクラスのラッパーを返します。 - URLパターンに付けられた名前により、 逆検索が可能になります。
- 1つの場所からURLの構造を制御できるため、URL名は、あるビューから別のビューにリンクするとき、またはリダイレクトするときに役立ちます。
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>
注意すべきいくつかの新しい部分:
- コンテキストからのフォームは、モデルのDjangoフォームです。 独自のものを指定しなかったため、Djangoが作成しました。 思いやり
-
{{ form }}
を{{ form }}
ばかりの場合、テーブルの行を取得します。 ただし、.as_ul
を追加し.as_ul
。これにより、入力フィールドが順序付けられていないリストの要素として表示されます。.as_p
を使用してみて、何が起こるかを見てください。 - フォームを表示するとき( 例:自動生成 )、フィールドのみが表示されますが、タグ
/> , ;
フォームをフレーミングしない/>
, ;
テンプレートタグ{% csrf_token %}
、Djangoがプロジェクトからのリクエストであり、クロスサイトリクエストフォージェリ( CSRF )ではないと判断するための隠しフィールドを挿入します。 テンプレートに含めないようにしてください。ページには引き続きアクセスできますが、フォームを送信しようとするとエラーが発生します。
url
テンプレートタグを使用して、連絡先リストへのリンクを生成します。contacts-list
は、URL設定で指定したビューの名前であることに注意してください。 完全なパスの代わりにurl
を使用すると、リンク切れを心配する必要がありません。 テンプレートurl
は、Pythonコードのreverse
と同等です。