フォームの選択肢として表示する場合や、
フリーワード検索などでユーザーからGETでデータを受け取り照合する場合など、
テンプレートタグが使えない場合もあると思います。
選択肢をすべて表示する場合は FruitCategory.FRUIT_CATEGORY
を、個別の model object の name
の値を表示する場合は instance.get_name_display()
を使えばよくて( get_FOO_display()
はご存知のとおりテンプレートの中でも使えますし、テンプレートの外で通常のメソッドとしても使えます)、これだけでは困る具体的なケースというのが私はパッと思い浮かびません。
・・・というので、回答 or ヒントになるのではないかと思いますが、いかがでしょう。これでは解決しない場合は、実際に困られているケースについてもう少し具体的にご説明いただければ、より具体的な議論がさせていただけるものと思います。
追記 2019/04/10
やむをえずご返信が遅くなってしまいました。。。申し訳ありません。コメントでいただいたポイントに付いてコメントさせていただきます。
1、フォームのSelectの選択肢(option)がDB名(key)のままになってしまう
ここでいう「フォーム」というのは、対象のモデルのオブジェクトに対する編集フォームという意味ではなく、ご自身で作られた検索ページか何かのフォームのことかなと受け取りましたが、この理解で正しいでしょうか?
もしこの理解が正しければ、例えば ChoiceField
の choices
に FruitCategory.FRUIT_CATEGORY
を渡す等すればよいのかなと思います。こういうことではなくて、でしょうか。
forms.py
:
python
1from .models import FruitCategory
2
3class SearchForm(forms.Form):
4 name = forms.ChoiceField(choices=FruitCategory.FRUIT_CATEGORY)
2、フリーワード検索の照合がDB名(key)で行われてしまう
こちらは、格納される値のパターンが限定されたフィールドに対して、フリーワード検索をさせる、ということですか?もしそうなら、対象が限定されているのでセレクトボックスやラジオボタンを使った方が UI/UX 的によいのかなと思うのですが、あえてフリーワード検索にする何らかの理由がある感じ、ですかね。そうする必要がある状況のイメージがパッとわかないのですが、どうしてもそれが必要なようでしたら、 view の側で ラベル→値
の変換をかけるとよいのではないかと思います。
イメージとしては、例えば、 name
の値で FruitCategory
の検索ができる関数ベースの view は次のような感じに書くイメージです。
python
1from .models import FruitCategory
2
3def search(request):
4 form = SearchForm(request.POST or None)
5 queryset = FruitCategory.objects.all()
6 if form.is_valid():
7 data = form.cleaned_data
8 # 'りんご' と入力されたらそれに対応する 'apple' で `filter()` をかける
9 if data['name']:
10 for value, label in FruitCategory.FRUIT_CATEGORY:
11 if data['name'] == label:
12 queryset = queryset.filter(name=value)
13 break
14
15 # あとは適切なレスポンスを返す
16 return render(...)
ご参考になるでしょうか。遅かったので、すでにご解決されたかもしれませんが、ご参考になればと思います :)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/02 14:21
2019/04/10 05:56