更改Django ModelChoiceField以显示用户的全名而不是用户名

Ada*_*dam 34 python django django-forms django-authentication

我在我的Django应用程序(不是管理员)中有一个表单,允许工作人员从下拉列表中选择用户.

forms.ModelChoiceField(queryset = User.objects.filter(is_staff=False), required = False)
Run Code Online (Sandbox Code Playgroud)

问题是下拉列表按用户名显示用户,而我宁愿从user.get_full_name()显示其全名,并且只有在不可用时才使用用户名.我只是真的需要在这个页面上进行此更改,在管理员等其他地方,我不在乎它是否使用用户名.

有没有办法可以做到这一点?

谢谢!

Bar*_*tek 64

您可以设置一个自定义ModelChoiceField,返回您想要的任何标签.

在fields.py或适用的地方放置类似的内容.

class UserModelChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
         return obj.get_full_name()
Run Code Online (Sandbox Code Playgroud)

然后在创建表单时,只需使用该字段即可

 UserModelChoiceField(queryset=User.objects.filter(is_staff=False), required = False)
Run Code Online (Sandbox Code Playgroud)

更多信息可以在这里找到


Ker*_*ge0 21

使用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()
Run Code Online (Sandbox Code Playgroud)

从这个答案定制/sf/answers/546407711/