効果的な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> 

泚意すべきいく぀かの新しい郚分

Source: https://habr.com/ru/post/J242261/


All Articles