主に基づいてノート公式文書、メモを取ると、ドキュメントへのリンクを含んでキーポイント、キー公式を抽出します。公式ドキュメントを参照してください。
公式文書:Djangoのドキュメント
推奨ブログ:Django2.2チュートリアル
ディレクトリ
Djangoはフォームを作成し、フォームデータを処理する助けに豊富なフレームワークを提供します。
フォームの公式文書:フォームを、文書の基本的な部分: 概要 | フォームAPI | ビルトインフィールド | ビルトインウィジェット。
1. HTMLフォーム
HTMLにおいて、フォームは、 <form>...</form>
その中にユーザ入力ラベルを収集してもよいし、サーバーにデータを送信します。
HTMLフォームには、二つのものを指定する必要があります。
- 目的地:URLにより送信された宛先ユーザデータ
- 方法:データを送信するためのHTTPメソッドを使用します
Djangoの管理サイトのログインフォームのHTMLの例に:
<form action="/admin/login/?next=/admin/" method="post" id="login-form">
<input type='hidden' name='csrfmiddlewaretoken'
value='NNHZaDVJGduajNMECXygKZkAt8vyEcw9HS2qm2Vdf7brDZrA0qK1R0I7M2p3TKcs' />
<div class="form-row">
<label class="required" for="id_username">用户名:</label>
<input type="text" name="username" autofocus maxlength="254" required id="id_username" />
</div>
<div class="form-row">
<label class="required" for="id_password">密码:</label>
<input type="password" name="password" required id="id_password" />
<input type="hidden" name="next" value="/admin/" />
</div>
<div class="submit-row">
<label> </label> <input type="submit" value="Log in" />
</div>
</form>
- フォームデータ
<form>
の 属性は、 URLを指定し、フォームを送信する必要があるブラウザを教えてくれ。action
method
プロパティは、 HTTPメソッドを指定する-などpost
;(GETおよびPOST)- フォームは、多くの含ま
<input>
要素:type="text"
ユーザー名、type="password"
パスワードtype="submit"
、「ログイン」ボタンのを。 - あなたがクリックすると
<input type="submit" value="Log in">
要素を、データが指定されたURLに送信されます。
通常の状況下で、我々はHTMLページに手動で行う必要があり、書き込みラベルおよび他の要素は、その中に形成します。しかし、これはあまりにも面倒で、Djangoのフォーム機能は、作業の多くを簡素化し、自動化することができ、上記の。
2. Djangoのフォームで
Djangoのフォームは、3つの異なる部分の処理が伴います。
- 次のステップを描画するために、準備したデータを再編成
- データのためのHTMLフォームを作成します。
- 受信してデータ処理し、クライアントによって送信されたフォーム
あなたは できる 達成するために、手動でコードを書いたが、Djangoは、あなたがすべての作業を行うことができます。
Djangoのフォーム書面、我々はモデル系において非常によく似たモデルを記述します。モデル、フィールドデータテーブルの代表、およびの形の代表的なフィールドを形成する
<form>
1つの<input>
要素。Djangoは、システムのコアコンポーネントを形成さForm
基づきます。
処理やレンダリング形態の例
ジャンゴでオブジェクトをレンダリング、通常我々:
- ビューでそれを得る(例えば、データベースから削除)
- テンプレートコンテキストにそれを渡します
- HTMLタグにそれを拡張するためにテンプレート変数を使用します
テンプレートでフォームをレンダリングほとんどその他の型のオブジェクトをレンダリングするように、いくつかの重要な違いがあります。
3. 使用Djangoのフォーム
通常3つの段階:
- 書かれたフォームクラス
- ビューの契約
- テンプレート処理
あなたは、ユーザーの名前を取得するには、サイト上で簡単なフォームを作成するとします。テンプレート内のコードのようなものを使用する必要があります。
<form action="/your-name/" method="post">
<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" value="{{ current_name }}">
<input type="submit" value="OK">
</form>
フォームに関連する関連ニーズは、フォーム内の関連する治療を行うと、その検証を行います。使用Djangoのフォームは、作業のほとんどを超える完成します。
3.1.编写Form
カテゴリ
上記形態によって提供されるDjangoのフォームクラスは、HTMLで手動で記述する必要をなくし、自動的に生成することができます。
現在では、アプリ内の新しい作成するforms.py
(のようなファイルviews.py
、models.py
など):
# forms.py
from django import forms
class NameForm(forms.Form):
your_name = forms.CharField(label='Your name', max_length=100)
まず、それはHTMLでだ <input>
の追加 maxlength="100"
(これは複数のユーザ入力文字列のこの数より初めてのブラウザを防ぐことができます)。第二に、それはまた、ジャンゴ、認証するためにデータの長さ(ある、サーバー側の検証)におけるブラウザフォーム上パスを受け取ることになります。
注意:
- 事前モジュールでフォームのインポート
- すべてのクラスはforms.Formフォームクラスを継承しなければなりません
- 各フォームは、言語HTMLの一種に対応するようなフィールドタイプCharFieldですとして独自分野有する
<form>
フォーム要素要素。この設計とDjangoのモデルシステムは非常に似ています。- 設定用のタグラベル命令の例
max_length
100長さの最大限界。また、二つの役割、100個の以上の文字を入力することはできませんユーザーを制限するために、ブラウザで1ページを果たしている、第二には、バックエンドサーバーに100以上にすることができないユーザー入力の長さを検証することです。- Djangoは各インスタンスが内蔵された形成
is_valid()
方法と、受信したデータが有効であるかどうかを確認します。すべてのデータが正当なものである場合、メソッドはtrueを返し、すべてのフォームデータは、それが呼ばれるダンプcleaned_data
プロパティが辞書型のデータで、プロパティを。
次のように読み込み、実際のHTML要素にレンダリング上記のフォーム、:
<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" maxlength="100" required />
それは含まれていないことを注意<form>
ラベル自体と送信ボタンを!なぜ?CSS、JSおよび他の同様のブートストラップ・フレームワークを埋め込まれた独自のアクションとフォームを制御することが容易!
3.2。ビューの契約
フォームデータは、ビューによって処理され、このリリースの一般的な形態は、同じロジックの一部を再利用するための図と同じです。
フォームを処理するためには、それは我々がリリースされたURLを表示どうなるかに対応するインスタンス化する必要があります。
# views.py
from django.shortcuts import render
from django.http import HttpResponseRedirect
from .forms import NameForm
def get_name(request):
# 如果form通过POST方法发送数据
if request.method == 'POST':
# 接受request.POST参数构造form类的实例
form = NameForm(request.POST)
# 验证数据是否合法
if form.is_valid():
# 处理form.cleaned_data中的数据
# ...
# 重定向到一个新的URL
return HttpResponseRedirect('/thanks/')
# 如果是通过GET方法请求数据,返回一个空的表单
else:
form = NameForm()
return render(request, 'name.html', {'form': form})
- GETメソッド要求ページでは、フォームの空のインスタンスを作成して、テンプレートのレンダリングのコンテキストに配置し、ユーザーがデータを記入できるように、空のフォームを返さ。
- POSTメソッド、フォームデータ、及び検証のための。
- データは、法的および実行を継続するために、通常のビジネスロジックに従ったものである場合には、
- 正当でない場合は、フロントページの以前のデータにフォームを返し、ユーザー変更
公式ドキュメントを参照してください。
3.3。テンプレート処理
Djangoテンプレート、我々はあなたが完全なHTMLページを取得することができ、次のプロセスを押す必要があります:
<form action="/your-name/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit">
</form>
Djangoテンプレート言語を介してすべての属性とフォームフィールド {{ form }}
のHTMLタグへの溶液バッグ。
注意:
<form>...</form>
独自のラベルを書き込むには、- POSTメソッドを使用するときは、追加する必要があります
{% csrf_token %}
CSRFセキュリティメカニズムを処理するためにタグを。{{ form }}
Djangoは、私たちが物事の上に何をすべきかである、あなたのためのフォームラベルの他のすべての要素を代表して生成されました。- 手動で追加するボタンの必要性を提出してください!
これらはあなたが知る必要があるエントリです。
4. 詳細Formクラス
モデルとフォーム
フォームをする場合は実際には、直接Djangoのモデルを追加または編集するために使用して、 のModelForm それはに基づいて行われますので、あなたは、時間、労力、地方のコードを保存することができ
Model
、そのプロパティフォームクラスで対応するフィールドを構築します。参考:モデルからフォームの作成
4.1。フィールドのコメント
実際には、Djangoのフォームモジュールには、我々は、フォームフィールドの多くを構築しました。
次の形式を参照してください。
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField(max_length=100)
message = forms.CharField(widget=forms.Textarea)
sender = forms.EmailField()
cc_myself = forms.BooleanField(required=False)
この場合、私たちのフォームには4つのあり subject
:フィールドを message
、 sender
と cc_myself
。Typeフィールドは、3使用 CharField
可能な:、 EmailField
と BooleanField
。
フィールドタイプを参照の完全なリスト フォームフィールド 。
4.2。ウィジェットのコントロール
各フィールドは、対応するフォーム有する 制御クラス のような入力要素のHTMLフォームの種類に対応した制御クラスを有するAを <input type="text">
。HTMLの実際の使用に必要な入力のどのようなタイプの、あなたはDjangoのフォームフィールドで適切なフィールドを選択する必要があります。たとえば、に<input type="text">
、あなたはいずれかを選択することができますCharField
。
4.3。フィールドデータ
どんなにどのようなフォームの提出データ、呼び出したら、 is_valid()
検証が成功した( is_valid()
リターン True
)、検証済みのフォームデータが中に配置されます form.cleaned_data
辞書。あなたはからできるform.cleaned_data
すべてのフォームデータ辞書を読んで。
ビュー内のデータ処理形態例:
# views.py
from django.core.mail import send_mail
if form.is_valid():
subject = form.cleaned_data['subject']
message = form.cleaned_data['message']
sender = form.cleaned_data['sender']
cc_myself = form.cleaned_data['cc_myself']
recipients = ['[email protected]']
if cc_myself:
recipients.append(sender)
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect('/thanks/')
5. 使用フォームテンプレート
簡単に言えば、フォームインスタンスのコンテキストテンプレートをすることができます。フォームは、このコンテキストで呼び出された場合したがって、 form
それは、 {{ form }}
それが適切なレンダリングする <label>
と <input>
素子。
フォームのレンダリングフォーマット
{{ form }}
テンプレート言語は、フォームが簡単にHTMLページにレンダリングすることができます。用 <label>
/ <input>
右だけでなく、他の出力オプション:
{{ form.as_table }}
フォームのレンダリング要素にテーブルとして各入力フレーム<tr>
ラベル{{ form.as_p }}
フォームに包まれた各入力ボックス<p>
タグ内{{ form.as_ul }}
各入力フレームのために、リストとしてレンダリングされたフォーム要素<li>
ラベル
注意:
- あなたは自分自身の外側の層を提供しなければならない
<table>
か<ul>
の要素を。- 出力の形式は ありません 外含める
<form>
ラベルとsubmit
コントロールを。これらは自分で用意する必要があります。
公式文書とより多くの情報の例としては、以下を参照してください。フォームのレンダリングフォーマットを。
フィールドマニュアルをレンダリング
直接は{{ form }}
十分に良いですが、多くの場合も、追加の制御の形式で入力要素にする必要がありますBootstarpsフレームワークを導入するために、このような使用CSSやJSのよう満たす要件に失敗します。
あなたはできる{{ form.name_of_field }}
各フィールドを取得し、それぞれのレンダリング。
タグラベルにも使用することができますlabel_tag()
生成する方法を。
公式ドキュメントを参照してください。
単なる基本的な内容よりも、より多くの公式ドキュメントを詳細に説明。フォームの公式文書:フォーム: 概要 | フォームAPI | ビルトインフィールド | ビルトインウィジェット。
- - -終わり - - -