38

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

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

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

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

ありがとう!

4

5 に答える 5

77

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)

詳細については、こちらをご覧ください

于 2010-07-02T17:27:49.543 に答える
31

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

于 2013-04-05T18:43:17.143 に答える
2

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

于 2010-07-02T17:27:32.507 に答える
2

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

于 2019-12-27T20:32:39.613 に答える
0

関数を渡すことができる1つのカスタムModelChoiceFieldを作成することもできます。そうすれば、さまざまな属性を表示するさまざまなフィールドがある場合、クラスは1つだけになります。

class CustomModelChoiceField(forms.ModelChoiceField):
name_function = staticmethod(lambda obj: obj)

def __init__(self, name_function, *args, **kwargs):
    if not name_function is None: self.name_function = name_function
    super(CustomModelChoiceField, self).__init__(*args, **kwargs)

def label_from_instance(self, obj):
     return self.name_function(obj);

次に、次のように簡単に呼び出すことができます。

form_field = CustomModelChoiceField(
    lambda obj: obj.get_full_name(),
    queryset=Whatever.objects.all(),
)

動的な処理を行う場合は、Noneを渡すこともできます。これは、基本的にデフォルトで通常のModelChoiceFieldになります。私はあまりPythonの人ではありませんが、これは私にとってはうまくいきます。

于 2020-05-21T06:42:48.083 に答える