django-admin startprojects <プロジェクト名>
python manage.py startapp <アプリケーション名>
python manage.py runserver
python manage.py makemigrations
python manage.py migrate
python manage.py showmigrations <アプリケーション名>
python manage.py migrate <アプリケーション名> 0001_initial
python manage.py createsuperuser
python manage.py test
python manage.py shell
クラス名 | 用途 |
RedirectView | リダイレクトに特化した処理 |
TemplateView | テンプレート表示に特化した処理 |
ListView | モデルオブジェクトの一覧を表示する |
CreateView | モデルオブジェクトを作成する |
DetailView | モデルオブジェクトの詳細を表示する |
UpdateView | モデルオブジェクトを更新する |
DeleteView | モデルオブジェクトを削除する |
FormView | フォーム処理をする |
オーバーライドする代表的なクラス変数
クラス変数 | 対応するビュー | 用途 | 使用例 |
template_name | RedirectView以外 | テンプレート名を指定する | template_name = “foo.html” |
model | ListView CreateView DetailView UpdateView DeleteView | モデルを指定する ※querysetを設定していない場合は必須 | model = FooModel |
paginate_by | ListView | 1ページに表示する件数を指定する | paginate_by = 10 |
queryset | ListView CreateView DetailView UpdateView DeleteView | テンプレートにクエリーセットを渡す ※get_querysetと違い、いつも同じクエリーの時に使える ※modelを設定しない場合は必須 | queryset = FooModel.objects.filter(foo=bar) |
form_class | CreqteView UpdateView FormView | フォームクラス名を指定する | form_class = FooForm |
success_url | CreateView UpdateView DeleteView FormView | 処理成功時にリダイレクトさせるURLを指定する ※動的に変わるURLを指定する場合はget_success_urlメソッドを使う | success_url = reverse_lazy(“app:index”) |
fields | CreateView UpdateView | ビューで使うフォームのフィールドを指定する | fields = (“field1”, field2, ) |
オーバライドする代表的なメソッド
メソッド | 対応するビュー | 用途 | 使用例 |
get_context_date | RedirectView以外 | テンプレートに辞書データを渡す | def get_context_data(self): context = super().get_context_data() context[“foo”] = FooModel.objects.get(user=self.request.user) return context |
get_queryset | ListView CreateView DetailView UpdateView DeleteView | テンプレートにクエリーセットを渡す ※querysetと違い、クエリーが都度変わるときに使える | def get_queryset(self): foo = FooModel.objects.filter(user=self.request.user) return foo |
form_valid | CreateView UpdateView FormView | フォームバリデーションに問題がなかったときに行う処理を記述する | def form_valid(self, form): messages.success(self, request, “成功しました”) return super().form_valid(form) |
form_invalid | CreateView UpdateView FormView | フォームバリデーションに問題があったときに行う処理を記述する | def form_invalid(self, form): message.error(self.request, “失敗しました”) return super().form_invalid(form) |
get_success_url | CreateView UpdateView DeleteView FormView | 処理成功時にリダイレクトさせるURLを指定する | def get_success_url(self): return reverse(“app:detail”, kwargs={“pk”:self.kwargs[“pk”]}) |
delete | DeleteView | 削除処理時に何か処理を追加する | def delete(self, request, *args, **kwargs): messages.success(self, request, “削除しました。”) return super().delete(request, *args, **kwargs) |
get | RedirectView TemplateView ListView CreateView DetailView UpdateView DeleteView FormView | ほかのメソッドには当てはまらないGET通信時の処理を記述する | def get(self, request, *args, **kwargs): return HttpResponse(“Hello World”) |
post | RedirectView CreateView UpdateView DeleteView FormView | ほかのメソッドには当てはまらないPOST通信時の処理を記述する | def post(self, request, *args, **kwargs): form = self.form_class(request.POST) if not form.is_valid(): return HttpResponseRedirect(reverse_lazy(“app:index”)) return render(request, self.template_name, {“form”:form}) |
代表的なフィールドクラス
フィールドクラス | デフォルトのウィジェット | デフォルトHTMLタグ |
CharField | TextInput | <input type=”text”> |
IntegerField | NumberInput | <input type=”number”> |
ChoiceField | Select | <select> |
DateField | DateInput | <input type=”text”> |
DateTimeField | DateTimeInput | <input type=”text”> |
EmailField | EmailInput | <input type=”email”> |
FileField | ClearableFileInput | <input type=”file”> |
ImageField | CrearableFileInput | <input type=”file”> |
全フィールドクラスで使える代表的なフィールドオプション
フィールドオプション | 用途 | 補足 |
required | 必須フィールドにするかどうか | True(必須)またはFalse(任意)を設定。デフォルトはTrue。 |
label | フォーム画面のラベルを設定 | – |
widget | ウィジェットを設定 | – |
validators | バリデータを設定 | – |
独自バリデーションの追加方法
独自バリデーションの追加方法 | 使い所 |
validatorsを使う | 異なるフォーム間やフォーム/モデル間で同じバリデーションを共有する。 |
「cleac_<フィールド名>」メソッドを使う | 単一フォーム内で単体フィールドバリデーションを行う。 |
「clean」メソッドを使う | 単一フォーム内でフィールドをまたがるバリデーションを行う。 |
代表的なモデルのフィールドクラス
フィールドクラス | データ型 | デフォルトのウィジェット | 補足 |
CharField | TextInput | ・フィールドオプション「max_length」が必須 ・短いテキスト向き | |
TextField | Textarea | 長いテキスト向き | |
IntegerField | NumberInput | 「-2147483648~2147483647」の範囲内で利用 | |
PositiveIntegerField | NumberInput | 「0~217483647の範囲内で利用 | |
FloatField | NumberInput | 浮動小数点数 | |
DateField | TextInput | ・「auto_now」オプションをTrueにすると、レコード更新のたびに現在日をセットする。 ・「auto_now_add」オプションをTrueにすると、レコード新規作成時に現在日をセットする。 ・「auto_now」と「auto_now_add」オプションはどちらか一方しか使えない。 | |
DataTimeField | TextInput | DateFieldと同じ |
全フィールドクラスで使える代表的なフィールドオプション
フィールドオプション | 用途 | 補足 |
null | データベースのNULL可否を設定 | デフォルトはFalse |
blank | フォームフィールドのブランク可否を設定 | デフォルトはFalse |
choices | フォームの選択肢を設定 | 以下はchoiceオプションを使った例。この場合、フォーム画面の選択ボックスには「選択肢A」「選択肢B」と表示されるが、データベースにはそれぞれ「a」、「b」と保存される。 class Example(models.Model): SELECTION = ((“a”, “選択肢A”), (“b”, “選択肢B”),) selection = models.CharField(max_length=1, choices=SELECTION) |
default | データベースのデフォルト値を設定 | – |
unique | データベースのユニーク制約を設定 | – |
verbose_name | フィールド名を設定 | – |
validators | バリデータを設定 | 使い方はフォームのときと同じ |
リレーションフィールドクラス
リレーションフィールドクラス | 関係 |
OneToOneField | 1対1 |
ForeignKey | 1対多 |
ManyToManyField | 多対多 |
on_deleteオプション
on_delete | 紐づけられたレコードを削除しようとしたときの動作 |
models.CASCADE | 一緒にレコードごと削除される |
models.PROTECT | 削除できない |
models.SET_NULL | NULLがセットされる (nullオプションがTrueである必要がある) |
models.SET_DEFAULT | デフォルト値がセットされる (defaultオプションを設定しておく必要がある) |
models.SET() | 任意の値がセットされる |
DO_NOTHING | 何もしない |
Djangoテンプレート言語
記法 | 用途 | 使用例 |
{{ <変数名> }} {{ <変数名>.<キー名> }} {{ <変数名>|<フィルタ> }} | 変数を表示する。フィルタは変数の用事を制御する。 | {{ value}} {{ valuel.key }} {{ value|default_it_none:”” }} |
{% <タグ名> %} | 条件分岐など多少複雑な処理を行う | {% if object %}…{% endif %} |
{# <コメント> #} | コメントを記述する | {# この記述は非表示 #} |
デフォルトで利用可能な代表的変数
変数名 | 格納されているデータ |
user | アクセスユーザー情報 |
object または <小文字モデル名> | ビューから渡されるモデルオブジェクト(1レコード) |
object_list_ または 「 <小文字モデル名>_lsit 」 | ビューから渡されるモデルオブジェクトのリスト |
messages | メッセージリスト |
form | フォームオブジェクト |
代表的な組み込みフィルタ
フィルタ | 機能 | 使用例 |
default | 変数の値がFalseに該当するときに表示する値を指定する | {{ var|default:” }} |
default_it_none | 変数の値がNoneに該当するときに表示する値を指定する | {{ var|default_if_none:” } |
linebreaksbr | 改行コード「\n」をHTMLの改行タグ「<br>」に変換する | {{ var|linebreaksbr }} |
safe | 自動エスケープを無効化する。テンプレートは自動エスケープがデフォルトで有効になっている。すなわち、以下の左側の5つの文字は右側の文字にデフォルトで自動的にエスケープされる。 < ⇒ < > ⇒ > ‘(シングルクォート) ⇒ Y “(ダブルクォート) ⇒ " & ⇒ & | {{ var|safe }} |
truncatechars | 先頭から数えて指定した文字数を超えた文字は切り詰める | |
urlize | URLとメールアドレスをHTMLのアンカータグ「<a>」でくくってクリック可能にする | {{ var|urlize }} |
代表的な組み込みタグ
タグ | 機能 | 使用例 |
autoscape | 自動エスケープ機能を制御する | {% autoescape on %} {{ body }} {% endautoescape %} |
block | 子テンプレートの内容に置き換える | |
extends | 親テンプレートを拡張することを宣言する | |
for…empty…endfor | ループさせる | |
if…elif…else…endif | 条件分岐させる | {% if foo_list %} 処理1 {% elif bar_list %} 処理2 {% else %} 処理3 {% endif %} |
load | カスタムテンプレートタグを読み込む | |
url | URLを逆引きする |
form変数のオプション
オプション | 用途 | 補足 |
as_p | <p>タグで描くフィールドをくくって描画 | – |
as_table | テーブル形式で各フィールドを描画 | <table>タグは出力されないので開発者側で補っておく必要がある |
as_ul | リスト形式で各フィールドを描画 | <ul>タグは出力されないので開発者側で補っておく必要がある |