Djangoアプリ(管理者ではない)に、スタッフがドロップダウンからユーザーを選択できるフォームがあります。
forms.ModelChoiceField(queryset = User.objects.filter(is_staff=False), required = False)
問題は、ドロップダウンにユーザー名でユーザーが表示されるのに対し、user.get_full_name()からのフルネームを表示し、それが利用できない場合にのみユーザー名を使用することです。このページでこの変更が本当に必要なのは、adminのような他の場所で、ユーザー名を使用するかどうかは関係ありません。
これを行う方法はありますか?
ありがとう!
必要なラベルを返すカスタムModelChoiceField
を設定できます。
このようなものをfields.py内または該当する場所に配置します。
class UserModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return obj.get_full_name()
次に、フォームを作成するときに、そのフィールドを使用するだけです
UserModelChoiceField(queryset=User.objects.filter(is_staff=False), required = False)
詳細情報を見つけることができます ここ
ModelFormで作業するとき、特にモデル定義でlimit_choices_toを使用したため、クエリセットを再定義する必要がないように、次のことが最も便利であることがわかりました。
class MyModelForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyModelForm, self).__init__(*args, **kwargs)
self.fields['user'].label_from_instance = lambda obj: "%s" % obj.get_full_name()
この回答からカスタマイズ https://stackoverflow.com/a/7805824/432992
フィールドをカスタムのModelChoiceField
でオーバーライドし、label_from_instance
関数を変更して代わりにget_full_name
を返すことができます。 ModelChoiceField
のドキュメントを参照してください: http://docs.djangoproject.com/en/1.2/ref/forms/fields/#modelchoicefield
モデル形式のフィールドの選択を変更したい場合は、Bartekの答えを次のように適応させてみてください。
モデル:
class MyModel(models.Model)
user = models.ForeignKey(...)
フォームフィールド:
class UserModelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return obj.get_full_name()
形:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = ['user']
field_classes = {
'user': UserModelChoiceField
}
このアプローチでは、フィールドのパラメーターが保持されます(queryset
、required
などを指定する必要はありません)。