LoginSignup
balloon_flower
@balloon_flower

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

【Django】ModelFormで作成したプルダウンのデフォルト値「---------」を非表示にしたい。

解決したいこと

ModelFormを使用し、ForeignKeyで紐づけたフィールドのプルダウンを作成しました。その際のデフォルト値「---------」を表示されないようにしたいです。

自分で試したこと

使用するコード

models.py
class Item(models.Model):
    language = models.CharField('花言葉', max_length=20)
        
class Main(models.Model):
    name = models.CharField('', max_length=20)
    language = models.ForeignKey(Item, on_delete=models.PROTECT, null=True, blank=True)
forms.py
class MainForm(forms.ModelForm):
    class Meta:
        model = Main
        fields = '__all__'
        widgets = {
            'name': forms.TextInput(attrs={'class': 'form_style'}),
            'language': forms.Select(attrs={'class': 'form_style'})
        }
views.py
def index(request):
    main_form = MainForm()
    context = {
        'main_form': main_form
    }
    return render(request, 'index.html', context)
index.html
<div>{{ main_form.language }}</div>

実際の画面上での表示は以下の画像となります。

スクリーンショット (1).png

画像内のデフォルト値となっている「---------」を無くすためには、どのようにすればよいのでしょうか?よろしくお願い申し上げます。

0

1Answer

forms.pyMainFormクラス内に以下のようにlanguageフィールドを追加し、その中にempty_label=Noneを追加すれば消せると思います。

手元で試していないので動くかどうかは未確認ですが、以下のような感じで実装すれば消せると思います。

forms.py
class MainForm(forms.ModelForm):
    language = forms.ModelChoiceField(
        queryset=Item.objects.all(), # Itemテーブルの値を全取得
        required=False,  # 必須項目にする場合はrequired=Trueにする
        empty_label=None,  # これによって「------------」が非表示になる
        widget=forms.Select(attrs={"class": "form_style"}),  # 元々、Metaクラスに実装されていたプルダウン用のwidget定義をこっちに持ってくる
        label="プルダウンのラベル名"
    )

    class Meta:
        model = Main
        fields = "__all__"
        widgets = {
            "name": forms.TextInput(attrs={"class": "form_style"})
        }

※参考※
https://subthread.co.jp/blog/20160531/

1

Comments

  1. @balloon_flower

    Questioner

    ご回答頂きました内容で、非表示にすることが出来ました。empty_labelやrequiredの設定はwidgetで行うものだと思っておりました...。ModelChoiceFieldにつきまして改めて学習いたします。
    とても助かりました!大変ご丁寧なご説明並びに参考リンクの掲載をしていただきありがとうございました!

  2. コメントありがとうございます。お役に立てたようでよかったですー!

Your answer might help someone💌