質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

14637閲覧

Django models.pyで定義した、CHOICESタプルの値の表示方法について

topy

総合スコア12

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/03/25 02:52

発生している問題・エラーメッセージ

下記ソースのようにmodels.pyを書いた際に、
CHOICESの中身を表示させようとすると、
通常keyが表示されるかと思います。

models

1class FruitCategory(models.Model): 2 3 FRUIT_CATEGORY = ( 4 ('apple', 'りんご'), 5 ('orange', 'オレンジ'), 6 ('grape', 'ぶどう'), 7 ('peach', 'もも'), 8 9 ) 10 11 name = models.CharField(_('フルーツカテゴリ'), max_length=10, choices=FRUIT_CATEGORY, unique=True, default='') 12 13 def __str__(self): 14 return self.name

ここで、テンプレートでは{{ get_name_display }}とすることで、
値を表示することができますが、
フォームの選択肢として表示する場合や、
フリーワード検索などでユーザーからGETでデータを受け取り照合する場合など、
テンプレートタグが使えない場合もあると思います。
(「りんご」とフォームに入力されても照合されず、「apple」と入力してもらう必要が出てくる)

そのようなケースを回避するべく、
テンプレートタグを介さずに値にアクセスするための処理について、
知見をご教示いただけますと幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

フォームの選択肢として表示する場合や、
フリーワード検索などでユーザーからGETでデータを受け取り照合する場合など、
テンプレートタグが使えない場合もあると思います。

選択肢をすべて表示する場合は FruitCategory.FRUIT_CATEGORY を、個別の model object の name の値を表示する場合は instance.get_name_display() を使えばよくて( get_FOO_display() はご存知のとおりテンプレートの中でも使えますし、テンプレートの外で通常のメソッドとしても使えます)、これだけでは困る具体的なケースというのが私はパッと思い浮かびません。

・・・というので、回答 or ヒントになるのではないかと思いますが、いかがでしょう。これでは解決しない場合は、実際に困られているケースについてもう少し具体的にご説明いただければ、より具体的な議論がさせていただけるものと思います。

追記 2019/04/10

やむをえずご返信が遅くなってしまいました。。。申し訳ありません。コメントでいただいたポイントに付いてコメントさせていただきます。

1、フォームのSelectの選択肢(option)がDB名(key)のままになってしまう

ここでいう「フォーム」というのは、対象のモデルのオブジェクトに対する編集フォームという意味ではなく、ご自身で作られた検索ページか何かのフォームのことかなと受け取りましたが、この理解で正しいでしょうか?

もしこの理解が正しければ、例えば ChoiceFieldchoicesFruitCategory.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/03/29 07:18

編集2019/04/10 05:56
gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

topy

2019/04/02 14:21

ご回答いただき誠にありがとうございます。 困っているケースについて、より具体的にご説明させていただきます。 1、フォームのSelectの選択肢(option)がDB名(key)のままになってしまう forms.pyでModelFormを定義しており、そのモデルフィールドにはリレーション先でchoicesで定義したフィールドがあります。formはテンプレートに出力する際にはget_name_displayは使えず、かといってformsやviewで使用する方法もわからず、こまっています。 2、フリーワード検索の照合がDB名(key)で行われてしまう フリーワード検索を実装していますが、例えばカテゴリモデルをchoicesで定義し、記事モデルとリレーションしたケースにおいて、ユーザーは表示名(値)で検索ワードを打ち込みますが、DB名(key)が検索対象となってしまい、検索が機能しない、ということで困っています。 上記、アドバイスをいただけますと幸いです。 (ご不明点がございましたら補足しますので、ご指摘いただければと思います) よろしくお願いいたします。
gh640

2019/04/10 05:56

コメントお戻しいただきありがとうございます。やむをえず反応が大変遅くなってしまいました。申し訳ありません。。いただいたポイントに対して追記で回答させていただきましたのでご覧いただければと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問