View All Posts. MiCHiLU.com powered by Django ;-)

[Django]: Django和訳ドキュメント sync to r5302

Django オンラインドキュメント和訳 更新しました。 Revision 5302 (2007/05/21). 「newforms ライブラリ」 「フィールドタイプ - DecimalField」 についての記述が更新されています。

以下、 diff -r 5272:5302 の主な変更分です。

ビューの実装例

これまでに紹介した内容をまとめる意味で,簡単な連絡フォームのビューメソッド の例を以下に示します

from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from django import newforms as forms

class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    message = forms.CharField()
    sender = forms.EmailField()
    cc_myself = forms.BooleanField()

def contact(request):
    if request.POST:
        f = ContactForm(request.POST)
        if f.is_valid:
            # ... do something with f.cleaned_data
            return HttpResponseRedirect('/url/on/success/')
    else:
        f = ContactForm()
    return render_to_response('contact.html', {'form': f})

as_p()

form をコンテキストに入れていれば,テンプレート上では以下のようにして出 力できます:

{{ f.as_p }}

as_ul()

form をコンテキストに入れていれば,テンプレート上では以下のようにして出 力できます:

{{ f.as_ul }}

as_table()

form をコンテキストに入れていれば,テンプレート上では以下のようにして出 力できます:

{{ f.as_table }}

デフォルトの設定はテーブル出力なので,以下のようにしても出力できます:

{{ f }}

ビューやテンプレートでフォームを使う

では,先ほどの連絡フォームを Django のビューとテンプレートに組み込みましょ う.以下のビューは,デフォルトでは連絡フォームを表示し, POST リクエストで アクセスすると,入力値の検証と処理を行います

def contact(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # Do form processing here...
            return HttpResponseRedirect('/url/on_success/')
    else:
        form = ContactForm()
    return render_to_response('contact.html', {'form': form})

簡単なテンプレート出力

上の例で使っているテンプレート, contact.html は,フォームを HTML で出 力する役割を担います.フォームの出力には,前述の フォームを HTML として出力する で述べたテク ニックを使えます.

フォームを HTML 出力するもっとも簡単な方法は,以下のようにフォーム変数その ものを使うというものです:

<form method="post">
<table>{{ form }}</table>
<input type="submit" />
</form>

上のテンプレートコードを使うと,フォームを form.as_table() メソッドによっ てHTML テーブルにして表示します.テーブルが表示されるのは,テンプレートシス テムがオブジェクトの __str__() 値を表示するようになっていて, Form クラスの __str__() メソッドが自身の as_table() メソッドを呼び出すか らです.

以下のコードも全く同じ出力を生成しますが,こちらの方がより明示的です:

<form method="post">
<table>{{ form.as_table }}</table>
<input type="submit" />
</form>

もちろん, form.as_ulform.as_p も使えます.

上の二つの例では, <form>, <table>, <input type="submit" />, </table> および </form> といったタグが入っていることに注意してくだ さい.フォームの便宜メソッド (as_table(), as_ul() および as_p()) は,これらの HTML タグを出力しません.

複雑なテンプレート出力

これまで何度か強調してきたように, as_table(), as_ul(), as_p() といったメソッドは,よく使う例に対するショートカットにすぎません.個々のフィー ルドを操作すれば,完全にテンプレートを制御してフォームの設計を行えます.

もっとも簡単な方法は, {% for field in form %} を使って,フォームのフィー ルドにわたって反復処理を行うというものです.例えば:

<form method="post">
<dl>
{% for field in form %}
    <dt>{{ field.label }}</dt>
    <dd>{{ field }}</dd>
    {% if field.help_text %}<dd>{{ field.help_text }}</dd>{% endif %}
    {% if field.errors %}<dd class="myerrors">{{ field.errors }}</dd>{% endif %}
{% endfor %}
</dl>
<input type="submit" />
</form>

このような反復処理のテクニックは,各フィールドに対して同じ HTML のフォーマッ トを適用したい場合や,あらかじめフォームフィールドの名前が分からない状況で フォームを生成したい場合などに役立ちます.フィールドは Form クラスで定 義されている順番に列挙されます.

反復処理を使う代わりに,フォームのフィールドを名前で明示した調整も行えます. フォームフィールドを明示的に指定するには, {{ form.fieldname }} のよう にします. fieldname はフィールドの名前です. 例を示します:

<form method="post">
<ul class="myformclass">
    <li>{{ form.sender.label }} {{ form.sender.label }}</li>
    <li class="helptext">{{ form.sender.help_text }}</li>
    {% if form.sender.errors %}<ul class="errorlist">{{ form.sender.errors }}</dd>{% endif %}

    <li>{{ form.subject.label }} {{ form.subject.label }}</li>
    <li class="helptext">{{ form.subject.help_text }}</li>
    {% if form.subject.errors %}<ul class="errorlist">{{ form.subject.errors }}</dd>{% endif %}

    ...
</ul>
</form>

フィールド型

Note

FloatField フォームフィールドと, DecimalField モデルフィールド およびフォームフィールドは,開発版で新たに登場した機能です.

※ フィールド「DecimalField」 が追加され、 モデルフィールド「FloatField」 のマッピングが フォームフィールド「FloatField」 へ変更されています。

DecimalField

固定精度の 10 進小数です. Python の Decimal 型インスタンスとして表現さ れます. 必須の 引数が 2 つあります:

引数 説明
max_digits 値を表現するのに使える最大桁数です.
decimal_places 小数部の保存に使われる桁数です.

例えば,小数部が 2 桁で, 999 までの数を表現できるようなフィールドを作成す るには,以下のようにします:

models.DecimalField(..., max_digits=5, decimal_places=2)

小数部の精度が 10 桁で, 10 億までの数を表現できるようにしたければ,以下の ようにします:

models.DecimalField(..., max_digits=19, decimal_places=10)

admin では, <input type="text"> (一行のテキスト入力) で表現されます.

既成のバリデータ

IsValidDecimal
整数桁数と小数桁数の最大値を (この順番に) 指定し,フィールドの値が 指定の桁数範囲を超えない浮動小数点数であるか検証します.
Mon, 21 May 2007 13:21:12 +0900 source edit
Creative Commons License
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.
View All Posts. MiCHiLU.com powered by Django ;-)