| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

Django APIs

提供: MyMemoWiki
ナビゲーションに移動 検索に移動

目次

Django APIs

Django | Python |

View レイヤー

shortcut

render_to_response

  • テンプレートとともにコンテキスト辞書を与えると、テキストが描画されたHttpResponseオブジェクトを返す
  1. 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 は、このオプションが与えら得れた場合、テキストフィールドの変わりにセレクトボックスを利用する。
  1. from django.db import models
  2. class MyModel1(models.Model):
  3. WEEK_CHOICES = (('0','Sun'),('1','Mon'),('2','Tue'),('3','Wed'),('4','Thu'),('5','Fri'),('6','Sat'))
  4. week = models.CharField(max_length=1, choices=WEEK_CHOICES)

Field.db_column

  • データベースのカラム名を指定する。指定しない場合、フィールド名を使用する。

Field.db_index

  • True に設定した場合、以下のようにCREATE INDEX 文を出力できる。
  1. C:\work\py\django\mysite>python manage.py sqlindexes myapp1
  2. BEGIN;
  3. CREATE INDEX "myapp1_mymodel1_field1" ON "myapp1_mymodel1" ("field1");
  4. 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
  1. from django.http import HttpResponse
  2. from django.template import Context, loader
  3. from django.forms import *
  4.  
  5. def index(request):
  6. t = loader.get_template('foobar/index.html')
  7. form = None
  8. result =
  9. if request.method == 'POST':
  10. form = HogeForm(request.POST)
  11. if form:
  12. if form.is_valid():
  13. pass
  14. (略)
  15. class HogeForm(Form):
  16. 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
  1. from django.forms import *
  2.  
  3. class FooForm(Form):
  4. CHOICE_LIST = (('01','ham'),('02','spam'))
  5. bar = CharField(widget=Select(choices=CHOICE_LIST))
  6.  
  7. def conv(self, data):
  8. choiced = self.cleaned_data['bar']
  9. :
  • テンプレート
  1. <form action='/hogehoge/' method='POST'>
  2. {% if form %}
  3. BAR:テンプレート:Form.bar
  4. {% 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

行列を指定する例
  1. from django.forms import *
  2. class HogeForm(Form):
  3. 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 ネストしたループの場合、親ループの現在の値を参照
配列の各要素をループする。
  1. def index(request):
  2. ctx = {}
  3. ctx['rows'] = range(1,4,1)
  4. return render_to_response('test/index.html', ctx)
  • index.html
  1. <table>
  2. {% for i in rows %}
  3. <tr><td>テンプレート:I</td><td><input type="text"></td></tr>
  4. {% endfor %}
  5. </table>
  • 結果

0383 django template tag for01.jpg

アイテムを繰り返し処理する
  1. {% for itm in item_list %}
  2. <a href="{{itm.detailPageURL}}"><img src="{{itm.smallImageURL}}"/></a>
  3. {% endfor %}

if と else

  • 変数を評価し、変数が true なら ブロックを表示する
  1. {% if rows %}
  2. rows size : テンプレート:Rows.
  3. {% else %}
  4. no rows.
  5. {% endif %}
結果

0384 django template tag if01.jpg


ifequal

  • 2 つの引数が等しい場合にブロックを出力する。
  1. {% ifequal style 'text' %}
  2. <div>
  3. スタイル変数が 'text' の場合このブロックを出力
  4. </div>
  5. {% endifequal %}

テンプレートの継承

基底
  • 派生でオーバーライドする箇所を、block [名前] ~ endblock で作成
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. {% block html_header %}
  6. {% endblock %}
  7. </head>
  8. <body>
  9. {% block content %}
  10. {% endblock %}
  11. </body>
  12. </html>
派生
  • 基底ファイルを extends で指定
  • オーバーライドする箇所を block [名前] ~ endblock で記述
  1. {% extends "base.html" %}
  2. {% block html_header %}
  3. <script type="text/javascript"><!--
  4. //--></script>
  5. <title>Title</title>
  6. {% endblock %}
  7. {% block content %}
  8. Content
  9. {% endblock %}

HTMLをそのまま出力する

  • |safeとする
  1. テンプレート:Digest.summary

フィルター

default

  • 変数が、false か 空の場合、デフォルトを表示する。そうでない場合は、変数の値を表示する。
  1. テンプレート:Value

length

  • 長さを返す。
  1. テンプレート:Value

striptags

  • タグを除いた値を返す。
  1. テンプレート:Value

divisibleby

  • 値が引数で割り切れるかどうか判定。割り切れれば True
  • mod 演算の代替として使える
  1. <table>
  2. <tr>
  3. {% for num in numlist %}
  4. <td align='right'>テンプレート:Num</td>
  5. <td><input type='text' size='6'></td>
  6. {% if num|divisibleby:"4" %}
  7. </tr><tr>
  8. {% endif %}
  9. {% endfor %}
  10. </tr>
  11. </table>
結果

0382 django template tag div01.jpg

Forms