Djangoのフォーム
HTMLフォームは、古典的な方法でインタラクティブなWebサイトです。 この章では、ユーザーによって投稿されたDjangoのフォームデータに対処する方法について説明します。
HTTPリクエスト
HTTPプロトコル "要求 - 応答"のよう。 クライアントが要求を送信すると、あなたは追加のデータを要求することができます。 サーバ解決要求は、クライアントからデータを取得することができ、かつURLに基づいて、特定のサービスを提供します。
GETメソッド
私たちは、ユーザの要求を受信するために、プロジェクトの前search.pyファイルを作成しました:
# -*- coding: utf-8 -*- from django.http import HttpResponse from django.shortcuts import render_to_response # 表单 def search_form(request): return render_to_response('search_form.html') # 接收请求数据 def search(request): request.encoding='utf-8' if 'q' in request.GET: message = '你搜索的内容为: ' + request.GET['q'].encode('utf-8') else: message = '你提交了空表单' return HttpResponse(message)
テンプレートディレクトリにsearch_form.htmlフォームテンプレートを追加します。
<html> <head> <meta charset="utf-8" /> <title>Search - w3cschool.cc</title> </head> <body> <form action="/search/" method="get"> <input type="text" name="q"> <input type="submit" value="Search"> </form> </body> </html>
次のようにurls.pyルールが改正されています。
from django.conf.urls import * from HelloWorld.view import hello from HelloWorld.testdb import testdb from HelloWorld import search urlpatterns = patterns("", ('^hello/$', hello), ('^testdb/$', testdb), (r'^search-form/$', search.search_form), (r'^search/$', search.search), )
アクセスアドレスします。http://192.168.45.3:8000 /検索フォーム/及び検索、次のような結果は次のとおりです。
POSTメソッド
上記の我々は、メソッドのGETを使用していました。 2つの治療へのビューの表示と要求処理機能。
より一般的にデータを送信する方法を投稿してください。 また、図を示し、URLとハンドラで、次のこのメソッドを使用して、要求を処理します。
私たちはtmplateにpost.htmlを作成しました:
<html> <head> <meta charset="utf-8" /> <title>Search - w3cschool.cc</title> </head> <body> <form action="/search-post/" method="post"> {% csrf_token %} <input type="text" name="q"> <input type="submit" value="Submit"> </form> <p>{{ rlt }}</p> </body> </html>
テンプレートの終わりに、私たちはテーブル結果のRLTマークプレースホルダーを追加しました。
{%csrf_token%}タグ後で表もあります。 CSRFは、クロスサイトリクエストフォージェリの略です。 これは、リクエストを送信偽造を防止するためのDjangoによって提供されています。 フォームを送信するPOSTメソッドは、このラベルを持っている必要があります。
HelloWorldのディレクトリに新しいsearch2.pyファイルやPOSTリクエストを処理するためにsearch_post機能を使用します。
# -*- coding: utf-8 -*- from django.shortcuts import render from django.core.context_processors import csrf # 接收POST请求数据 def search_post(request): ctx ={} ctx.update(csrf(request)) if request.POST: ctx['rlt'] = request.POST['q'] return render(request, "post.html", ctx)
次のようにurls.pyルールが改正されています。
from django.conf.urls import * from HelloWorld.view import hello from HelloWorld.testdb import testdb from HelloWorld import search from HelloWorld import search2 urlpatterns = patterns("", ('^hello/$', hello), ('^testdb/$', testdb), (r'^search-form/$', search.search_form), (r'^search/$', search.search), (r'^search-post/$', search2.search_post), )
次のようにアクセスhttp://192.168.45.3:8000/search-post/結果を表示します。
上記の例の完了後、我々のディレクトリ構造。
HelloWorld |-- HelloWorld | |-- __init__.py | |-- __init__.pyc | |-- models.pyc | |-- search.py | |-- search.pyc | |-- search2.py | |-- search2.pyc | |-- settings.py | |-- settings.pyc | |-- testdb.py | |-- testdb.pyc | |-- urls.py | |-- urls.pyc | |-- view.py | |-- view.pyc | |-- wsgi.py | `-- wsgi.pyc |-- TestModel | |-- __init__.py | |-- __init__.pyc | |-- admin.py | |-- models.py | |-- models.pyc | |-- tests.py | `-- views.py |-- manage.py `-- templates |-- base.html |-- hello.html |-- post.html `-- search_form.html 3 directories, 29 files
リクエストオブジェクト
各ビュー関数は第一引数はちょうどこんにちは()関数の下、のHttpRequestオブジェクトです:
from django.http import HttpResponse def hello(request): return HttpResponse("Hello world")
HttpRequestオブジェクトは、現在の要求のURLに関するいくつかの情報が含まれています。
プロパティ | 説明 |
パス | ドメイン名を含まない要求されたページへのフルパス、 - 例えば、「/こんにちは/ "。 |
方法 | 要求表示に使用される文字列のHTTPメソッド。 これは、すべて大文字を表します。 例えば: == 'GET' request.method場合: |
GET | これは、すべてのHTTP GETが辞書のようなオブジェクトパラメータが含まれています。 QueryDictのマニュアルを参照してください。 |
POST | これは、すべてのHTTP POSTパラメータ辞書のようなオブジェクトが含まれています。 QueryDictのマニュアルを参照してください。 状況POSTリクエストサーバは、空も可能である受信します。 つまり、フォームのフォームは、HTTP POSTメソッドを介して要求を提出するが、データを形成することはできません。 request.POST場合したがって、文はHTTP POSTメソッドを使用するかどうかを決定するために使用することはできません。あなたが使用する必要がありますrequest.method場合== "POST"(この表のメソッド属性を参照してください)。 注:POSTは、ファイルアップロードの情報が含まれていません。 FILESのプロパティを参照してください。 |
REQUEST | 便宜上、このプロパティはPOSTの集まりであり、属性を取得するが、そこに特殊性、POST最初のプロパティをチェックし、属性をGET見えます。 リファレンスPHPの$ _REQUEST。 POST = { "年齢": '34'}:あなたは= { "ジョン"が "名"} GET場合たとえば、その後[ "name"を]は、要求値が「ジョン」、[ "年齢"] REQUESTの値です"34" より明確に、これらの二つの属性は、理解し、コードが簡単に書かれたので、強く、GETやPOSTを使用することをお勧めします。 |
COOKIES | すべてのCookieは、標準のPython辞書オブジェクトが含まれています。 キーと値は文字列です。 第12章を参照してください、クッキーについてのより詳細な説明があります。 |
FILES | すべてアップロードされたファイルを含む辞書のようなオブジェクト。 。各キーがあるファイルの<input type = "ファイル"の名前は= "" />タグのname属性の値は、各値は、以下の3キーが含まれている標準のPython辞書オブジェクトであるファイル:
注:のみリクエストメソッドがPOSTで、要求ページの<form>持っているにenctype = "multipart / form-data"属性のファイルはデータのみを持っています。 そうでない場合、FILESは空の辞書です。 |
META | 利用可能なすべてのHTTPヘッダ辞書を含みます。 例えば:
METAこれらのヘッダーには、例えば、HTTP_が最もキー接頭辞:
|
ユーザー | Django.contrib.auth.models.Userは、現在ログオンしているユーザーを表すオブジェクトです。 あなたは、ユーザーが現在ログインしていないアクセスすると、ユーザーはdjango.contrib.auth.models.AnonymousUserのインスタンスを初期化されます。 あなたがログインしているユーザのユーザのis_authenticated()メソッドによって識別することができます。 if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users. DjangoはAuthenticationMiddlewareをプロパティが利用可能である場合にのみアクティブに |
セッション | 辞書オブジェクトの現在のセッションを表すだけ書き込み可能なプロパティ。 セッションはプロパティが提供していた場合にのみDjangoが活性化されます。 第12章を参照してください。 |
raw_post_data | 生のHTTP POSTデータは、解析されません。 治療を進めたときに有用です。 |
Requestオブジェクトはまた、いくつかの便利なメソッドがあります。
ウェイ | 説明 |
---|---|
__getitem __(キー) | GET / POSTのキーを返し、最初のGETを取った後、POSTを取ります。 キーはスローKeyError例外存在しない場合。 これは、我々はのHttpRequestオブジェクトにアクセスするには、辞書の構文を使用することができるものです。 たとえば、リクエスト[ "fooが"]最初request.POST [ "foo"という]その後request.GET [ "foo"という]操作に相当します。 |
has_key() | request.GETを確認するか、request.POSTパラメータには、キーを含めるかどうかを指定します。 |
get_full_path() | リターンパス要求は、クエリ文字列が含まれています。 たとえば、「/音楽/バンド/ the_beatles /?印刷= true "を |
is_secure() | リクエストが安全である場合、つまり、放出された光は、HTTPS要求である場合にtrueを返します。 |
QueryDictオブジェクト
HttpRequestのオブジェクトでは、GETとPOST属性はdjango.http.QueryDictクラスインスタンスです。
マルチ値は単結合に対応するのケースを処理するためのQueryDict同様のカスタム辞書クラス。
すべての標準辞書のメソッドを実装するのQueryDict。 この方法はまた、特定の含まれています:
ウェイ | 説明 |
---|---|
__getitem__ | 標準辞書プロセス)はキー値に対応する数の場合、つまり、少し異なっている、__ __getitem __ __(最後の値を返します。 |
__setitem__ | パラメータを設定すると、キー(Pythonリスト)のリストの値を指定します。 注:これはのみ変更可能なのQueryDictオブジェクト上で(コピーはコピー経由で()のQueryDictオブジェクトを生成)と呼ぶことができます。 |
取得() | キーが値に対応する複数の場合は、()を取得最後の値を返します。 |
アップデート() | パラメータは、のQueryDictにすることができ、それは、標準的な辞書であることができます。 異なる標準辞書のアップデート方法と辞書項目を追加するのではなく、それらを交換する方法: >>> q = QueryDict('a=1') >>> q = q.copy() # to make it mutable >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # returns the last ['2'] |
項目() | 標準辞書項目があります()メソッドは、()メソッドは、単一の値論理__getitemの__を使用して、少し異なります。 >>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')] |
値() | 標準辞書値()メソッドは、)(__メソッドは、単一の値論理__getitemを使用して、少し異なります。 |
また、いくつかの方法、次の表があるのQueryDict:
ウェイ | 説明 |
---|---|
コピー() | オブジェクトのコピー、Pythonの標準ライブラリcopy.deepcopyにおける内部実装を返します()。 このコピーは変更可能(変更可能)である - つまり、あなたはコピーの値を変更することができます。 |
GETLIST(キー) | Pythonのリストが返されるすべてのパラメータとは、対応するキーの値を返します。 キーが存在しない場合は、空のリストを返します。 ある種のリストを返すことが保証です.. |
セットリスト(キー、list_) | キー値list_を設定します(とは異なり__setitem __())。 |
appendlist(キー項目) | 鍵および関連する内部リストに項目を追加します。 |
setlistdefault(キー、リスト) | そして、少し違っは、SetDefault、それは引数としてリストではなく、単一の値を受け入れます。 |
リスト() | そして、それは例えば、リストとして、キー値のすべてを返します、少し異なる項目()です。 >>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])] |
urlencode() | クエリ文字列フォーマットを実行するためにフォーマットされた文字列を返します(たとえば、「= 2&B = 3&B = 5 ")。 |