web-dev-qa-db-ja.com

Django ModelChoiceFieldを変更して、ユーザー名ではなくユーザーのフルネームを表示する

Djangoアプリ(管理者ではない)に、スタッフがドロップダウンからユーザーを選択できるフォームがあります。

forms.ModelChoiceField(queryset = User.objects.filter(is_staff=False), required = False)

問題は、ドロップダウンにユーザー名でユーザーが表示されるのに対し、user.get_full_name()からのフルネームを表示し、それが利用できない場合にのみユーザー名を使用することです。このページでこの変更が本当に必要なのは、adminのような他の場所で、ユーザー名を使用するかどうかは関係ありません。

これを行う方法はありますか?

ありがとう!

36
Adam

必要なラベルを返すカスタム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)

詳細情報を見つけることができます ここ

68
Bartek

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

22
Kerridge0

フィールドをカスタムのModelChoiceFieldでオーバーライドし、label_from_instance関数を変更して代わりにget_full_nameを返すことができます。 ModelChoiceFieldのドキュメントを参照してください: http://docs.djangoproject.com/en/1.2/ref/forms/fields/#modelchoicefield

2
Mark Lavin

モデル形式のフィールドの選択を変更したい場合は、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
        }

このアプローチでは、フィールドのパラメーターが保持されます(querysetrequiredなどを指定する必要はありません)。

1
lampslave