33013


djangoでModelFormを利用しないFormの中でSelectを定義しているのですが、この選択肢一覧をstaticに配置し、これを読み込みたいのですが、方法がわかりません

[code]

    from django import forms
    from django.contrib.staticfiles.templatetags.staticfiles import static
    from django.contrib.admin import widgets
    import os
    
    class sampleForm(forms.Form):
        pref_id = forms.ChoiceField(widget=forms.Select, choices=PREF_CHOICE)
    
[/code]

上記のフォームで以下の外部ファイルで定義した変数(PREF_CHOICE)を読み込みたいと考えています  
なお、外部ファイルはlist.pyとしてstaticフォルダに配置しています

[code]

    PREF_CHOICE = (
        ('', '都道府県'),
        ('1', '北海道'),
        ('2', '青森県'),
        ('3', '岩手県'),
        ('4', '宮城県'),
        ('5', '秋田県'),
        ('6', '山形県'),
        ('7', '福島県'),
        ('8', '茨城県'),
        ('9', '栃木県'),
        ('10', '群馬県'),
        ('11', '埼玉県'),
        ('12', '千葉県'),
        ('13', '東京都'),
        ('14', '神奈川県'),
        ('15', '新潟県'),
        ('16', '富山県'),
        ('17', '石川県'),
        ('18', '福井県'),
        ('19', '山梨県'),
        ('20', '長野県'),
        ('21', '岐阜県'),
        ('22', '静岡県'),
        ('23', '愛知県'),
        ('24', '三重県'),
        ('25', '滋賀県'),
        ('26', '京都府'),
        ('27', '大阪県'),
        ('28', '兵庫県'),
        ('29', '奈良県'),
        ('30', '和歌山県'),
        ('31', '鳥取県'),
        ('32', '島根県'),
        ('33', '岡山県'),
        ('34', '広島県'),
        ('35', '山口県'),
        ('36', '徳島県'),
        ('37', '香川県'),
        ('38', '愛媛県'),
        ('39', '高知県'),
        ('40', '福岡県'),
        ('41', '佐賀県'),
        ('42', '長崎県'),
        ('43', '熊本県'),
        ('44', '大分県'),
        ('45', '宮崎県'),
        ('46', '鹿児島'),
        ('47', '沖縄県'),
    )
    
[/code]

forms.pyの中に書けば、問題なく動きますが、不細工なのでなんとかしたく...


CC BY-SA 3.0
2017-03-01T09:33:16.913
33012
2017-03-01T09:59:22.860
19780
question
python django
【Django】外部ファイルに定義した変数をforms.pyで読み込みたい


実装している forms.py と同じディレクトリに(list.pyというモジュール名はちょっと避けた方が良いので) `consts.py`
という名前で置いてください。

そして、forms.pyの最初の方で、 `from .consts import PREF_CHOICE` としてimportしてください。


CC BY-SA 3.0
2017-03-01T09:44:27.100
33013
2017-03-01T09:44:27.100
806
33012
answer


staticフォルダは（Djangoのデフォルト設定では）静的ファイルを配置するフォルダですので、Pythonモジュールを配置する場所として不適切です。

Pythonのパスが通っているディレクトリに配置すれば、適切にimport文を追加することで参照可能になりますが、list.pyという名前はPython標準ライブラリの`list`関数と重複してしまうため、好ましくありません。

list.pyの名前を変更し、forms.pyと同じディレクトリに配置、forms.pyからimportすることをおすすめします。

ファイル構造例

[code]

    {your_django_app}
    ├── choices.py  <- 元list.py
    ├── forms.py
    ├── models.py
    └── views.py
    
[/code]

forms.py例

[code]

    from __future__ import absolute_import
    from django import forms
    from django.contrib.staticfiles.templatetags.staticfiles import static
    from django.contrib.admin import widgets
    import os
    
    from . import choices
    # または from {your_django_appのモジュールパス} import choices
    
    class sampleForm(forms.Form):
        pref_id = forms.ChoiceField(widget=forms.Select, choices=choices.PREF_CHOICE)
    
[/code]

なお、使用しているPythonのバージョンが3.0以上であれば、 `from __future__ import absolute_import`
は不要です。


CC BY-SA 3.0
2017-03-01T09:59:22.860
33014
2017-03-01T09:59:22.860
3481
33012
answer