はじめに
この記事は、python3.6.5,Django2.0を使用した開発を進めていく上で
template周りの記述で悩んだ内容を記載しています
以下のような対応方法を記載しています。
①TEMPLATEでCHOICESの内容を名前で表示
②TEMPLATEでDBの任意の順番のデータを取得する。
③TEMPLATEでVIEWから取得したコンテキスト情報のエスケープ文字を変換したくない
④CRUDのフォームでラベル名、フォームを動的に変更したい。
また、特記しない場合は、models.pyは以下のモデルを使用していると想定します。
LIST_CHOICES = ((0, 'TEST0'), (1, 'TEST1'),(2, 'TEST2'))
class StatusData(models.Model):
status = models.IntegerField(choices = LIST_CHOICES)
①CHOICESの内容を名前で表示
models.pyで設定したLIST_CHOICESの情報を名前(表示用文字列)で表示したい。
TEMPLATE内で下記のようにテーブルの値をそのまま表示しようとすると、VALUE値がそのまま表示される。
ステータスの値は{{statusdata.status}}
# WEBでの表記はセットされている値に応じてValue値が表示(0、1、2)される
対応方法
下記のようにフィールド名の前後にget_[フィールド名]_display
と記載すると表示用文字を取得することができる。
ステータスの値は{{statusdata.get_status_display}}
# WEBでの表記はセットされている値に応じて表示用文字が表示(TEST0、TEST1、TEST2)される
②TEMPLATEでDBの任意の順番のデータを取得する。
複数レコード存在するDBの値の中で任意のレコード番号の値を取得したい。
対応方法
DBに複数レコードがある場合は、以下のようにして、listからオブジェクトを取得して使用することができる。
全て表示させる場合は以下のようにFOR分で値を取得ことができる。
{% for statusdata in statusdata_list %}
ステータスの値は{{statusdata.get_status_display}}
{% endfor %}
# queryにセットされている値をすべて表示する。
任意のレコード番号の値がほしい場合は、[リスト名].[レコード番号].フィールド名
とすることで任意のレコード番号の値を取得できる。
ステータスの値は{{customerinfo_list.0.get_status_display}} #1個目のレコードの内容を表示
ステータスの値は{{customerinfo_list.first.get_status_display}} #1個目はFIRSTでもOK
ステータスの値は{{customerinfo_list.1.get_status_display}} #2個目のレコードの内容を表示
# 該当のレコード番号の値を表示する。
③TEMPLATEでVIEWから取得したの内容のエスケープ文字を変換したくない
VIEWからコンテキストデータに値を設定して、TEMPLATEで表示させたいときに、
エスケープ文字があると、自動的に変換されてしまう。
class StatusView(generic.Templateview):
template_name = 'template.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context[jsondata] = [{'name':'名前1','address':'住所1'}]
return context
取得してきた値は{{jsondata}} #そのまま取得
# 表示内容は、「取得してきた値は"name":"名前1","address":"住所1"」となる
対応方法
組み込みタグsortを使用する。
取得してきた値は{{jsondata|sort}} #そのまま取得
# 表示内容は、「取得してきた値は'name':'名前1','address':'住所1'」となる
JAVASCRIPTでJSONデータを等をやり取りするときに役に立つと思います。
④CRUDのフォームでラベル名、フォームを動的に変更したい。
基本的にCRYSPY_FORMや、BOOTSTRAP_FORMを使用したときのラベルは、models.pyのverbose_nameがラベルに表示される。
class userInfo(models.Model):
tel_number = models.CharField(
verbose_name='電話番号',
)
対応方法
この内容を動的に変更するには、各viewのget_context_dataでcontectのformを修正すればOK
#VIEW CLASS内
def get_context_data(self, **kwargs):
"""
フォームを取得
"""
context = super().get_context_data(**kwargs)
form = context['form']
# 情報の表示制御を行う
tel_number = form.fields['tel_number']
tel_number.label = "テルナンバー"
return context
tel_numberフォームのラベル名が”テルナンバー”に変更される。
同様に、form型を変更したい場合もここで書き換えが可能(下記例では非表示する)
#VIEW CLASS内
def get_context_data(self, **kwargs):
"""
フォームを取得
"""
context = super().get_context_data(**kwargs)
form = context['form']
# 情報の表示制御を行う
tel_number = form.fields['tel_number']
tel_number.widget = forms.HiddenInput()
return context
上記の設定でtel_numberのフォームタイプがhiddenに変更することができるため非表示になる。