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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3557閲覧

Django、外部キーのフィールドに対して初期値で選択肢を持たせたい。

ynj

総合スコア17

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/02/06 09:51

編集2019/02/09 16:35

前提・実現したいこと

下記の画像のような形で、頭文字で検索できる索引を作成したいと考えています。
イメージ説明
”登録フォーム”を選択する事で、下記画面に遷移します。
イメージ説明
この”initial”に対し事前に選択肢を持たしたいのですが、表示されません。

該当のソースコード

models.py

from django.db import models class Initial(models.Model): CHOICE_INITIAL = ((1, "あ"), (2, "い"), (3, "う"),) initial = models.CharField( verbose_name="頭文字", choices=CHOICE_INITIAL, max_length=5,) def __str__(self): return self.initial class Detail(models.Model): class Meta: db_table = "detail" detail = models.CharField( verbose_name="詳細", max_length=200) created_at = models.DateTimeField( verbose_name='登録日', auto_now_add=True,)    updated_at = models.DateTimeField( verbose_name="更新日", auto_now=True,) initial = models.ForeignKey( Initial, on_delete=models.CASCADE, null=True,) def __str__(self): return self.detail

forms.py

from .models import Detail,Initial class DetailForm(forms.ModelForm): class Meta: initial = forms.ModelChoiceField(queryset=Initial.objects.all()) model = Detail fields = ('detail','initial',) widgets = {'detail': forms.Textarea(attrs={'rows':4,"cols": 15}),}

views.py

class DetailCreate(CreateView): model = Detail form_class = DetailForm template_name = "app1/detail_create.html" success_url = reverse_lazy("app1:sample")

お聞きしたい事

・外部キーのフィールドは、
forms.pyのwidgetにて、ModelChoiceFieldを使って選択肢
(今回であれば頭文字にあたる”あ”~”う”)を持たす事はできないのか?
・頭文字での索引の作成方法に関して、なにかテンプレートの作成方法があるのか?

以上二点、助言いただければ幸いです。
よろしくおねがいします。

補足情報(FW/ツールのバージョンなど)

python:3.6.1
Django:2.0

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

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

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

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

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

gh640

2019/02/09 05:36

「選択肢を持たす事はできないのか?」 → おそらくできると思います。 「事前に選択肢を持た」せるというのはもう少し具体的に言うとどのようなイメージでしょう?例えば、 a) `Initial` の一部のみを選択肢に含める(リクエストやユーザによらず固定)、 b) `Initial` の一部のみを選択肢に含める(リクエストやユーザによって変動)、 c) `Detail` の入力内容に応じて自動的に `Initial` を作成する、等のパターンが私は思いつきます。 また、 `initial` をユーザに選択させるかどうか、という点でもポイントがわかれるように思います。 「事前に」とおっしゃっているので c) の方向は無しなのかなと思いますが、このあたりの詳細を説明された方が的確な回答がもらえやすくなるのではないでしょうか。
gh640

2019/02/09 05:38

「頭文字での索引の作成方法はこの方向で正しいのか」 → 何をもって「正しい」とするかが難しいところですが、正しい、のでは、ないでしょうか。逆に、ご自身ではどのような点が気になりますか?気になるポイントを具体的にお出しになると、有益な回答がもらえやすくなると思います。
ynj

2019/02/09 16:33

ご返事ありがとうございます。 理想の機能的には、c)だとおもいますが、実装方法が思いつきませんでした。 ので一旦a)の様に、models.py>class Detail>initial、に対して「事前に選択肢をもたせ」(今回の"あ"~"う")、それを登録時に選択させることで、索引機能を実装しようと考えいます。 ”頭文字の索引の方向性~”の意図としては、なにかテンプレートの作成方法があるかという意味でした。 機能的にはタグ機能と似たようなものかなと考えていますが、もし考えた方自体が間違っているなら、正しい方法を知りたいと考えています。
guest

回答2

0

ベストアンサー

コメントお戻しいただきありがとうございます。

ので一旦a)の様に、models.py>class Detail>initial、に対して「事前に選択肢をもたせ」(今回の"あ"~"う")、それを登録時に選択させることで、索引機能を実装しようと考えいます。

ご存知のとおり ForeignKey フィールドは「外部テーブルのレコード」を参照するためのものですので、 "あ" 〜 "う" を選択できるようにされたいのであれば、 Initial 側で "あ" 〜 "う" に対応するレコードを事前に追加しておくのが素直なやり方ではないでしょうか。

例えば、現状のテーブル構造を前提とするなら、 Initial クラスを次のように定義しておいて

python

1class Initial(models.Model): 2 CHOICE_INITIAL = (("あ", "あ"), ("い", "い"), ("う", "う"),) 3 4 initial = models.CharField( 5 verbose_name="頭文字", 6 choices=CHOICE_INITIAL, 7 unique=True, 8 max_length=5,) 9 10 def __str__(self): 11 return self.initial 12 13 @classmethod 14 def seed(cls): 15 for initial, label in cls.CHOICE_INITIAL: 16 cls.objects.get_or_create( 17 initial=initial, 18 )

メソッド Initial.seed() を shell や独自の management command で実行しておく、とすると、 DetailFormInitial のレコードが利用できる、という形になるかと思います。

”頭文字の索引の方向性~”の意図としては、

タグ機能と似たようなもの、という考え方で私は間違っていないのではないかと思います。

ご参考になれば幸いです :)

(お考えのとおり c) の形にした方がユーザがシンプルに使えてよいような気もしますが、まずは一度お試しになってみてください。)
(尚上のコードは私の手元で動作確認をしていません。ちゃんと動く確信は無いので、一字一句そのまま採用するのではなくあくまでアイデアのみの参考と捉えていただければと思います。)

投稿2019/02/10 03:04

gh640

総合スコア1407

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

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

ynj

2019/02/27 15:14 編集

お返事遅くなりました。 回答いただいたコードを記載し、 python manage.py shellの上でInitial.seed()を実行し、DB上に登録することで解決しました。 ”shell や独自の management command で実行しておく”の意味を理解しておらず、 回答のコードを記載するだけで、自動で処理されるものだと思っていました。 今後は、入力した内容が自動割り振りされるような方法を考えていきたいと思います。 また質問出せていただくと思いますが、その際はよろしくおねがいします。 ありがとうございました。
gh640

2019/03/02 09:20

ご丁寧にありがとうございます。 「 shell で実行しておく」というのはまさしく「 python manage.py shellの上でInitial.seed()を実行し、DB上に登録する」の意味のつもりで言っていました。言葉足らずでしたね。。 ともあれ問題をご解決されたとのことでよかったです。がんばってください!
guest

0

ちょっと正しい回答か不安なのですが、CHOICE_INITIAL = ((1, "あ"), (2, "い"), (3, "う"),)をクラスの中で定義しているの(属性になってしまっている)のが原因かな、と思います。
ですので、クラス定義の外でCHOICE_INITIALを書くと表示されるのではないでしょうか。

投稿2019/02/09 23:15

ryotax

総合スコア142

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

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

ynj

2019/02/27 15:13

お返事遅くなりました。 問題ですが、回答頂いた方法では解決できませんでした。 結果としては、ベストアンサーにした方の方法で解決をすることできました。 回答ありがとうございました。感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問