Django

[Django] ログイン必須のページを作る

前回、ログイン機能を実装してみましたが、今度はログインした人専用(ログイン必須)のページを作ってみましょう。

関数ベースのビューの場合

関数ベースのビューを利用するなら以下のようにするだけでログインしていない場合は自動的にログインページにリダイレクトされるようになります。

from django.contrib.auth.decorators import login_required

@login_required
def loggedInView(request):
  return render(request,"template/template.html")

ログインした人だけが閲覧できるページにデコレーターを利用して関数の前に@login_requiredをつけるだけです。

[Django] テンプレートで文字を切り詰めたい

最近のwebデザインでカード内に本文がちょっとだけ載っているデザインをよく目にします。
Djangoでも同じように表示させたいという願望のもとテンプレート内で文字列の切り詰め(トランケート)をしてみたいと思います。

[Django] 404ページをカスタマイズする

Djangoで存在しないURLにアクセスすると以下のような404ページが表示されます。

デバックモード

デバックモード

本番モード

本番モード

通常はデバックモードでサイトの運営はしないと思うので本番モードのシンプルな、というか味気ない404ページが表示されてしまいます。
まあ、シンプルな方が良いという人はこのままでも良いのですが、折角なら自分のサイトの雰囲気に合った親切な404ページを表示したいですよね。

Djangoのfilterを自作してみる

Djangoには便利なフィルターが多数用意されていますが、自分の使いたい機能が足りないと思うこともあります。
**無いなら作ればいいじゃないか!**精神のもとDjangoのフィルターを自作してみます。

[Django]知ってると便利なforで使える小技

Djangoのtemplate内で利用するfor文で知ってるとテンプレートがすっきり書けるかもしれない小技の紹介

まずはシンプルに

"values":["A","B","C"]

{% for value in values %}
  {{ value }}
{% endfor %}

シンプルにリストをforで回しました。
タプルやレンジオブジェクトも同様に回すことが可能です。

Djangoでログイン機能を作る

今回はDjangoにもともと用意されている機能だけでログイン機能(ユーザー認証)を実装してみようと思います。

環境

python 3.6.3 Django 2.0.8

プロジェクトの作成

まずは、Djangoのプロジェクトを作るところから始めましょう。
myprojectという名前のプロジェクトを作成します。
適当なディレクトリに移動して

[Django] DateTimeFieldからUnix時間を取り出す

やりたいこと

DjangoのデータベースのDateTimeFieldからUNIX時間を取り出したい。

UNIX時間とは?

UNIX時間、またはUNIX時刻とはコンピューターシステム上での時刻表現の一種。協定世界時 (UTC) での1970年1月1日午前0時0分0秒から形式的な経過秒数。

Djangoのデータベース操作まとめ

クエリメソッド(QueryAPI)一覧表

Django v2.0に対応

各メソッドの詳細は公式サイトを参照のこと https://docs.djangoproject.com/ja/2.0/ref/models/querysets/

大分類小分類メソッド
全件取得all()
検索条件を指定肯定filter(**kwargs)
NOT条件exclude(**kwargs)
IN条件の中身をリストで指定するin_bulk(id_list=None, field_name=‘pk’)
並び順を指定昇順order_by(*fields)
降順reverse()
クエリセットから
インスタンスを取得
検索に一致したものget(**kwargs)
指定した日付順で
最新のもの
latest(*fields)
指定した日付順で
最古のもの
earliest(*fields)
クエリセットの先頭first()
クエリセットの最後last()
レコードを新規登録する新規登録create(**kwargs)
条件に一致するものを取得
無い場合は新規登録して取得
get_or_create(defaults=None, **kwargs)
条件に一致するものを更新
無い場合は新規登録
update_or_create(defaults=None, **kwargs)
一括登録するbulk_create(objs, batch_size=None)
一括更新するupdate(**kwargs)
一括削除するdelete()
特定のフィールドを集計テーブル内の集計aggregate(*args, **kwargs)
参照先テーブルの集計annotate(*args, **kwargs)
該当のレコード件数count()
抽出したレコードから
重複の無い日付配列を作る
dates(field, kind, order=‘ASC’)
抽出したレコードから
重複の無い時刻配列を作る
datetimes(field_name, kind, order=‘ASC’, tzinfo=None)
クエリセットの存在をチェックexists()
インスタンスの一部だけを取得結果を辞書のリストで取得values(*fields, **expressions)
結果をタプルのリストで取得values_list(*fields, flat=False, named=False)
特定のフィールドの
重複無しリストを作る
distinct(*fields)
SQLを直接実行するSQLを直に設定する(一部)extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
SQLを直に設定する(全部)raw(raw_query, params=None, translations=None)
クエリセット同士の集合演算和集合union(*other_qs, all=False)
積集合intersection(*other_qs)
差集合difference(*other_qs)
パフォーマンスチューニング
キャッシング
SQLのJOIN句を使って
関係先を同時に取得しキャッシュ
1-1,N-1で有効
select_related(*fields)
関係先を先行取得してキャッシュ
1-N、N-Nで有効
prefetch_related(*lookups)
パフォーマンスチューニング
重いカラムを取得しない
指定カラムだけ取得しないdefer(*fields)
指定カラムだけ取得するonly(*fields)
パフォーマンスチューニング
巨大なテーブルをループで扱う
iterator(chunk_size=2000)
データベースのレコードロックselect_for_update(nowait=False, skip_locked=False, of=())
デフォルト以外のデータベースusing(alias)
空のクエリセットを作るnone()

データベースの検索

filter, exclude, getでは検索条件を指定する。
指定方法は用意された記述法を使う。詳しくは公式サイトの以下のページを参照