LoginSignup
1
2

More than 5 years have passed since last update.

DJANGO初心者が悩んだテンプレートの記載方法

Last updated at Posted at 2018-11-13

はじめに

この記事は、python3.6.5,Django2.0を使用した開発を進めていく上で
template周りの記述で悩んだ内容を記載しています
以下のような対応方法を記載しています。
①TEMPLATEでCHOICESの内容を名前で表示
②TEMPLATEでDBの任意の順番のデータを取得する。
③TEMPLATEでVIEWから取得したコンテキスト情報のエスケープ文字を変換したくない
④CRUDのフォームでラベル名、フォームを動的に変更したい。

また、特記しない場合は、models.pyは以下のモデルを使用していると想定します。

model.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値がそのまま表示される。

template.html
ステータスの値は{{statusdata.status}}  
#WEBでの表記はセットされている値に応じてValue値が表示(0、1、2)される

対応方法
下記のようにフィールド名の前後にget_[フィールド名]_display
と記載すると表示用文字を取得することができる。

template.html
ステータスの値は{{statusdata.get_status_display}}
#WEBでの表記はセットされている値に応じて表示用文字が表示(TEST0、TEST1、TEST2)される

②TEMPLATEでDBの任意の順番のデータを取得する。

複数レコード存在するDBの値の中で任意のレコード番号の値を取得したい。

対応方法
DBに複数レコードがある場合は、以下のようにして、listからオブジェクトを取得して使用することができる。
全て表示させる場合は以下のようにFOR分で値を取得ことができる。

template.html
{% for statusdata in statusdata_list %}
ステータスの値は{{statusdata.get_status_display}}
{% endfor %}
#queryにセットされている値をすべて表示する。

任意のレコード番号の値がほしい場合は、[リスト名].[レコード番号].フィールド名
とすることで任意のレコード番号の値を取得できる。

template.html
ステータスの値は{{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で表示させたいときに、
エスケープ文字があると、自動的に変換されてしまう。

views.py
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

template.html
取得してきた値は{{jsondata}}   #そのまま取得
#表示内容は、「取得してきた値は"name":"名前1","address":"住所1"」となる

対応方法
組み込みタグsortを使用する。

template.html
取得してきた値は{{jsondata|sort}}   #そのまま取得
#表示内容は、「取得してきた値は'name':'名前1','address':'住所1'」となる

JAVASCRIPTでJSONデータを等をやり取りするときに役に立つと思います。

④CRUDのフォームでラベル名、フォームを動的に変更したい。

基本的にCRYSPY_FORMや、BOOTSTRAP_FORMを使用したときのラベルは、models.pyのverbose_nameがラベルに表示される。

models.py
class userInfo(models.Model):
    tel_number = models.CharField(
        verbose_name='電話番号',
    )

対応方法

この内容を動的に変更するには、各viewのget_context_dataでcontectのformを修正すればOK

 views.py

    #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型を変更したい場合もここで書き換えが可能(下記例では非表示する)

 views.py

    #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に変更することができるため非表示になる。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2