1. ホーム
  2. python

[解決済み] Django のセレクトボックスの空白オプションのカスタマイズと削除

2023-07-18 14:32:56

質問

私は Django 1.0.2 を使っています。 私は、モデルによってバックアップされた ModelForm を書きました。 このモデルは、blank=False の ForeignKey を持っています。 Django がこのフォームの HTML を生成するとき、 ForeignKey が参照するテーブルの各行に対して、一つの選択肢を持つセレクトボックスを作成します。 また、リストの一番上に、値を持たず、ダッシュの羅列で表示されるオプショ ンを作成します。

<option value="">---------</option>

私が知りたいのは

  1. この自動生成されたオプションをセレクト ボックスから削除する最もクリーンな方法は何ですか。
  2. として表示されるようにカスタマイズする最もきれいな方法は何ですか。

    <option value="">Select Item</option>
    
    

解決策を探しているときに、私は Django チケット 4653 を見つけ、他の人も同じ疑問を持っていて、 Django のデフォルトの動作が変更されたかもしれないという印象を持ちました。 このチケットは 1 年以上前のものなので、これらのことを達成するためのもっときれいな方法があるかもしれないと期待していました。

どんな助けにも感謝します。

ジェフ

編集:ForeignKeyフィールドをこのように設定しました。

verb = models.ForeignKey(Verb, blank=False, default=get_default_verb)

これはデフォルトを設定し、empty/dashesオプションではなくなっていますが、残念ながら私の疑問のどちらも解決していないようです。 つまり、empty/dashes オプションはまだリストに表示されたままです。

どのように解決するのですか?

まだテストしていませんが、Django のコードを読む限りでは はここにあります。 はこちら で動作するはずです。

class ThingForm(models.ModelForm):
  class Meta:
    model = Thing

  def __init__(self, *args, **kwargs):
    super(ThingForm, self).__init__(*args, **kwargs)
    self.fields['verb'].empty_label = None

EDIT : これは 文書化された がありますが、自動生成されたモデルフォームで作業している場合は、必ずしも ModelChoiceField を探すことを知らないでしょう。

EDIT : jlppが回答で指摘しているように、これは完全ではありません。empty_label属性を変更した後に、選択肢をウィジェットに再割り当てする必要があります。 これはちょっと面倒なので、ModelChoiceField全体をオーバーライドするのが理解しやすいかもしれません。

class ThingForm(models.ModelForm):
  verb = ModelChoiceField(Verb.objects.all(), empty_label=None)

  class Meta:
    model = Thing