「Django APIs」の版間の差分
ナビゲーションに移動
検索に移動
1行目: | 1行目: | ||
− | ==Django APIs== | + | ==[[Django APIs]]== |
[[Django]] | [[Python]] | | [[Django]] | [[Python]] | | ||
*http://docs.djangoproject.com/en/dev/ | *http://docs.djangoproject.com/en/dev/ | ||
6行目: | 6行目: | ||
===shortcut=== | ===shortcut=== | ||
====render_to_response==== | ====render_to_response==== | ||
− | * | + | *テンプレートとともにコンテキスト辞書を与えると、テキストが描画されたHttp[[R]]esponseオブジェクトを返す |
render_to_response(template[, dictionary][, context_instance][, mimetype]) | render_to_response(template[, dictionary][, context_instance][, mimetype]) | ||
19行目: | 19行目: | ||
====Field.choices==== | ====Field.choices==== | ||
*選択フィールドとして、2 要素を持つタプルの繰り返しを利用する。 | *選択フィールドとして、2 要素を持つタプルの繰り返しを利用する。 | ||
− | *Django admin は、このオプションが与えら得れた場合、テキストフィールドの変わりにセレクトボックスを利用する。 | + | *[[Django]] admin は、このオプションが与えら得れた場合、テキストフィールドの変わりにセレクトボックスを利用する。 |
from django.db import models | from django.db import models | ||
class MyModel1(models.Model): | class MyModel1(models.Model): | ||
28行目: | 28行目: | ||
*データベースのカラム名を指定する。指定しない場合、フィールド名を使用する。 | *データベースのカラム名を指定する。指定しない場合、フィールド名を使用する。 | ||
====Field.db_index==== | ====Field.db_index==== | ||
− | *True | + | *True に設定した場合、以下のようにC[[R]]EATE INDEX 文を出力できる。 |
C:\work\py\django\mysite>python manage.py sqlindexes myapp1 | C:\work\py\django\mysite>python manage.py sqlindexes myapp1 | ||
BEGIN; | BEGIN; | ||
− | + | C[[R]]EATE INDEX "myapp1_mymodel1_field1" ON "myapp1_mymodel1" ("field1"); | |
− | + | [[COM]]MIT; | |
====Field.db_tablespace==== | ====Field.db_tablespace==== | ||
*フィールドにインデックスを張る場合に使用するテーブルスペースを指定。 | *フィールドにインデックスを張る場合に使用するテーブルスペースを指定。 | ||
63行目: | 63行目: | ||
|False | |False | ||
|- | |- | ||
− | | | + | |値の[[正規化]] |
| True or False | | True or False | ||
|- | |- | ||
74行目: | 74行目: | ||
|} | |} | ||
=====例===== | =====例===== | ||
− | from django.http import | + | from django.http import Http[[R]]esponse |
from django.template import Context, loader | from django.template import Context, loader | ||
from django.forms import * | from django.forms import * | ||
101行目: | 101行目: | ||
====EmailField==== | ====EmailField==== | ||
====FileField==== | ====FileField==== | ||
− | *Django Fileアップロード例 | + | *[[Django Fileアップロード例]] |
====FilePathField==== | ====FilePathField==== | ||
====FloatField==== | ====FloatField==== | ||
114行目: | 114行目: | ||
====TextField==== | ====TextField==== | ||
====TimeField==== | ====TimeField==== | ||
− | ==== | + | ====U[[R]]LField==== |
− | ==== | + | ====[[XML]]Field==== |
==Forms== | ==Forms== | ||
133行目: | 133行目: | ||
|'' (空文字) | |'' (空文字) | ||
|- | |- | ||
− | | | + | |値の[[正規化]] |
|ユニコードオブジェクト | |ユニコードオブジェクト | ||
|- | |- | ||
157行目: | 157行目: | ||
<form action='/hogehoge/' method='POST'> | <form action='/hogehoge/' method='POST'> | ||
{% if form %} | {% if form %} | ||
− | + | BA[[R]]:{{form.bar}} | |
{% endif %} | {% endif %} | ||
====TypedChoiceField==== | ====TypedChoiceField==== | ||
172行目: | 172行目: | ||
====MultipleChoiceField==== | ====MultipleChoiceField==== | ||
====NullBooleanField==== | ====NullBooleanField==== | ||
− | ==== | + | ====[[R]]egexField==== |
====TimeField==== | ====TimeField==== | ||
− | ==== | + | ====U[[R]]LField==== |
===Built-in widgets=== | ===Built-in widgets=== | ||
194行目: | 194行目: | ||
====NullBooleanSelect==== | ====NullBooleanSelect==== | ||
====SelectMultiple==== | ====SelectMultiple==== | ||
− | ==== | + | ====[[R]]adioSelect==== |
====CheckboxSelectMultiple==== | ====CheckboxSelectMultiple==== | ||
====MultiWidget==== | ====MultiWidget==== | ||
237行目: | 237行目: | ||
=====配列の各要素をループする。===== | =====配列の各要素をループする。===== | ||
− | * | + | *[[vi]]ews.py |
def index(request): | def index(request): | ||
ctx = {} | ctx = {} | ||
253行目: | 253行目: | ||
=====アイテムを繰り返し処理する===== | =====アイテムを繰り返し処理する===== | ||
{% for itm in item_list %} | {% for itm in item_list %} | ||
− | <a href="{{itm. | + | <a href="{{itm.detailPageU[[R]]L}}"><img src="{{itm.smallImageU[[R]]L}}"/></a> |
{% endfor %} | {% endfor %} | ||
278行目: | 278行目: | ||
=====基底===== | =====基底===== | ||
*派生でオーバーライドする箇所を、block [名前] ~ endblock で作成 | *派生でオーバーライドする箇所を、block [名前] ~ endblock で作成 | ||
− | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> | + | <!DOCTYPE html PUBLIC "-//W3C//DTD [[HTML]] 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
<html> | <html> | ||
<head> | <head> | ||
304行目: | 304行目: | ||
{% endblock %} | {% endblock %} | ||
− | === | + | ===[[HTML]]をそのまま出力する=== |
*|safeとする | *|safeとする | ||
{{digest.summary|safe}} | {{digest.summary|safe}} | ||
326行目: | 326行目: | ||
{{ value|striptags }} | {{ value|striptags }} | ||
− | ==== | + | ====di[[vi]]sibleby==== |
*値が引数で割り切れるかどうか判定。割り切れれば True | *値が引数で割り切れるかどうか判定。割り切れれば True | ||
*mod 演算の代替として使える | *mod 演算の代替として使える | ||
335行目: | 335行目: | ||
<td align='right'>{{ num }}</td> | <td align='right'>{{ num }}</td> | ||
<td><input type='text' size='6'></td> | <td><input type='text' size='6'></td> | ||
− | {% if num| | + | {% if num|di[[vi]]sibleby:"4" %} |
</tr><tr> | </tr><tr> | ||
{% endif %} | {% endif %} |
2020年2月16日 (日) 04:24時点における最新版
目次
- 1 Django APIs
- 2 View レイヤー
- 3 Model レイヤー
- 3.1 Field オプション
- 3.2 Field タイプ
- 3.2.1 AutoField
- 3.2.2 BooleanField
- 3.2.3 CharField
- 3.2.4 CommaSeparatedIntegerField
- 3.2.5 DateField
- 3.2.6 DateTimeField
- 3.2.7 DecimalField
- 3.2.8 EmailField
- 3.2.9 FileField
- 3.2.10 FilePathField
- 3.2.11 FloatField
- 3.2.12 ImageField
- 3.2.13 IntegerField
- 3.2.14 IPAddressField
- 3.2.15 NullBooleanField
- 3.2.16 PositiveIntegerField
- 3.2.17 PositiveSmallIntegerField
- 3.2.18 SlugField
- 3.2.19 SmallIntegerField
- 3.2.20 TextField
- 3.2.21 TimeField
- 3.2.22 URLField
- 3.2.23 XMLField
- 4 Forms
- 4.1 Built-in Field
- 4.1.1 BooleanField
- 4.1.2 CharField
- 4.1.3 ChoiceField
- 4.1.4 TypedChoiceField
- 4.1.5 DateField
- 4.1.6 DateTimeField
- 4.1.7 DecimalField
- 4.1.8 EmailField
- 4.1.9 FileField
- 4.1.10 FilePathField
- 4.1.11 FloatField
- 4.1.12 ImageField
- 4.1.13 IntegerField
- 4.1.14 IPAddressField
- 4.1.15 MultipleChoiceField
- 4.1.16 NullBooleanField
- 4.1.17 RegexField
- 4.1.18 TimeField
- 4.1.19 URLField
- 4.2 Built-in widgets
- 4.2.1 TextInput
- 4.2.2 PasswordInput
- 4.2.3 HiddenInput
- 4.2.4 MultipleHiddenInput
- 4.2.5 FileInput
- 4.2.6 DateInput
- 4.2.7 DateTimeInput
- 4.2.8 TimeInput
- 4.2.9 Textarea
- 4.2.10 CheckboxInput
- 4.2.11 Select
- 4.2.12 NullBooleanSelect
- 4.2.13 SelectMultiple
- 4.2.14 RadioSelect
- 4.2.15 CheckboxSelectMultiple
- 4.2.16 MultiWidget
- 4.2.17 SplitDateTimeWidget
- 4.2.18 SelectDateWidget
- 4.1 Built-in Field
- 5 Template レイヤー
- 6 Forms
Django APIs
View レイヤー
shortcut
render_to_response
- テンプレートとともにコンテキスト辞書を与えると、テキストが描画されたHttpResponseオブジェクトを返す
render_to_response(template[, dictionary][, context_instance][, mimetype])
Model レイヤー
Field オプション
Field.null
- True に設定すると、エンプティ値をNULLとしてデータベースに格納する。
- デフォルトはFalse
Field.blank
- True に設定すると、ブランク値が許容される。デフォルトはFalse。
- 純粋にデータベースの問題である、null オプションとは異なり、値の妥当性検査に関係する。Falseの場合、入力必須となる。
Field.choices
- 選択フィールドとして、2 要素を持つタプルの繰り返しを利用する。
- Django admin は、このオプションが与えら得れた場合、テキストフィールドの変わりにセレクトボックスを利用する。
from django.db import models class MyModel1(models.Model): WEEK_CHOICES = (('0','Sun'),('1','Mon'),('2','Tue'),('3','Wed'),('4','Thu'),('5','Fri'),('6','Sat')) week = models.CharField(max_length=1, choices=WEEK_CHOICES)
Field.db_column
- データベースのカラム名を指定する。指定しない場合、フィールド名を使用する。
Field.db_index
- True に設定した場合、以下のようにCREATE INDEX 文を出力できる。
C:\work\py\django\mysite>python manage.py sqlindexes myapp1 BEGIN; CREATE INDEX "myapp1_mymodel1_field1" ON "myapp1_mymodel1" ("field1"); COMMIT;
Field.db_tablespace
- フィールドにインデックスを張る場合に使用するテーブルスペースを指定。
- デフォルトは、DEFAULT_INDEX_TABLESPACE セッティング
- バックエンドがサポートしない場合は無視される。
Field.default
- フィールドのデフォルト値
- 呼び出し可能オブジェクトを指定することもできる。その場合、呼ばれるたびに新規オブジェクトが作成される。
Field.editable
- False に設定すると、モデルクラスから自動的に生成される、admin もしくは forms においてフィールドは編集不可になる。
Field.help_text
Field.unique
Field.unique_for_date
Field.unique_for_month
Field.verbose_name
Field タイプ
AutoField
- 自動的に有効なIDをインクリメントして取得する IntegerField 。
- 主キーフィールドはモデルに暗黙的に追加され、AutoFieldとなるため、通常は直接使用する必要はない。
- save メソッドを呼び出すまでは None
BooleanField
項目 | 値 |
---|---|
デフォルトWidget | CheckboxInput |
未設定時 | False |
値の正規化 | True or False |
バリデーション | チェックがONの場合True |
エラーメッセージのKey | required |
例
from django.http import HttpResponse from django.template import Context, loader from django.forms import * def index(request): t = loader.get_template('foobar/index.html') form = None result = if request.method == 'POST': form = HogeForm(request.POST) if form: if form.is_valid(): pass (略) class HogeForm(Form): is_foo = BooleanField(required=False)
【注意】required=False
<blockquote>Field の派生クラスは、バリデーションの設定が、required=Trueだが、required=False としないと、チェックONでない場合、form.is_valid()が失敗してしまう。</blockquote>
CharField
CommaSeparatedIntegerField
DateField
DateTimeField
DecimalField
EmailField
FileField
FilePathField
FloatField
ImageField
IntegerField
IPAddressField
NullBooleanField
PositiveIntegerField
PositiveSmallIntegerField
SlugField
SmallIntegerField
TextField
TimeField
URLField
XMLField
Forms
Built-in Field
BooleanField
CharField
ChoiceField
項目 | 値 |
---|---|
デフォルトWidget | Select |
未設定時 | (空文字) |
値の正規化 | ユニコードオブジェクト |
バリデーション | リストの値に存在 |
エラーメッセージのKey | required、invalid_choice |
使用例
- Form
from django.forms import * class FooForm(Form): CHOICE_LIST = (('01','ham'),('02','spam')) bar = CharField(widget=Select(choices=CHOICE_LIST)) def conv(self, data): choiced = self.cleaned_data['bar'] :
- テンプレート
<form action='/hogehoge/' method='POST'> {% if form %} BAR:テンプレート:Form.bar {% endif %}
TypedChoiceField
DateField
DateTimeField
DecimalField
EmailField
FileField
FilePathField
FloatField
ImageField
IntegerField
IPAddressField
MultipleChoiceField
NullBooleanField
RegexField
TimeField
URLField
Built-in widgets
TextInput
PasswordInput
HiddenInput
MultipleHiddenInput
FileInput
DateInput
DateTimeInput
TimeInput
Textarea
行列を指定する例
from django.forms import * class HogeForm(Form): data = CharField(widget=Textarea(attrs=dict(rows='40', cols='50')))
CheckboxInput
Select
NullBooleanSelect
SelectMultiple
RadioSelect
CheckboxSelectMultiple
MultiWidget
SplitDateTimeWidget
SelectDateWidget
Template レイヤー
タグ
変数
- 変数は、{{ variable }} のように記述する。
- ピリオド"." で、変数の属性を参照できる。
for
forループの中で利用できる変数
変数 | 内容 |
---|---|
forloop.counter | 1 から始まるカウンタの現在位置 |
forloop.counter0 | 0 から始まるカウンタの現在位置 |
forloop.revcounter | 1 から始まり最後から現在していくカウンタの現在位置 |
forloop.revcounter0 | 0 から始まり最後から現在していくカウンタの現在位置 |
forloop.first | 繰り返し最初の要素の場合True |
forloop.last | 繰り返し最後の要素の場合True |
forloop.parentloop | ネストしたループの場合、親ループの現在の値を参照 |
配列の各要素をループする。
- views.py
def index(request): ctx = {} ctx['rows'] = range(1,4,1) return render_to_response('test/index.html', ctx)
- index.html
<table> {% for i in rows %} <tr><td>テンプレート:I</td><td><input type="text"></td></tr> {% endfor %} </table>
- 結果
アイテムを繰り返し処理する
{% for itm in item_list %} <a href="{{itm.detailPageURL}}"><img src="{{itm.smallImageURL}}"/></a> {% endfor %}
if と else
- 変数を評価し、変数が true なら ブロックを表示する
例
{% if rows %} rows size : テンプレート:Rows. {% else %} no rows. {% endif %}
結果
ifequal
- 2 つの引数が等しい場合にブロックを出力する。
{% ifequal style 'text' %} <div> スタイル変数が 'text' の場合このブロックを出力 </div> {% endifequal %}
テンプレートの継承
基底
- 派生でオーバーライドする箇所を、block [名前] ~ endblock で作成
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> {% block html_header %} {% endblock %} </head> <body> {% block content %} {% endblock %} </body> </html>
派生
- 基底ファイルを extends で指定
- オーバーライドする箇所を block [名前] ~ endblock で記述
{% extends "base.html" %} {% block html_header %} <script type="text/javascript"><!-- //--></script> <title>Title</title> {% endblock %} {% block content %} Content {% endblock %}
HTMLをそのまま出力する
- |safeとする
テンプレート:Digest.summary
フィルター
- フィルターを利用して、変数の表示を変更できる
- 次のように記述する テンプレート:Variables
- フィルターは連鎖できる。テンプレート:Text
- 引数をとるフィルターもある。テンプレート:Bio
- スペースを含むフィルターの引数は引用符で囲むテンプレート:List
- Django は約30種類の組み込みテンプレートフィルタを用意している。
default
- 変数が、false か 空の場合、デフォルトを表示する。そうでない場合は、変数の値を表示する。
テンプレート:Value
length
- 長さを返す。
テンプレート:Value
striptags
- タグを除いた値を返す。
テンプレート:Value
divisibleby
- 値が引数で割り切れるかどうか判定。割り切れれば True
- mod 演算の代替として使える
例
<table> <tr> {% for num in numlist %} <td align='right'>テンプレート:Num</td> <td><input type='text' size='6'></td> {% if num|divisibleby:"4" %} </tr><tr> {% endif %} {% endfor %} </tr> </table>
結果
Forms
© 2006 矢木浩人