将Django ModelChoiceField改为显示用户全名而非用户名

38 投票
5 回答
24130 浏览
提问于 2025-04-16 00:44

我在我的Django应用里有一个表单(不是在管理后台),这个表单让工作人员可以从下拉菜单中选择用户。

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

问题是,下拉菜单里显示的是用户的用户名,而我希望它能显示用户的全名,使用user.get_full_name()来获取全名,如果全名不可用再用用户名。我其实只需要在这个页面上做这个改动,像在管理后台的地方,我不在乎用用户名。

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

谢谢!

5 个回答

2

你可以用一个自定义的 ModelChoiceField 来覆盖这个字段,并把 label_from_instance 这个函数改成返回 get_full_name。想了解更多,可以查看 ModelChoiceField 的文档:http://docs.djangoproject.com/en/1.2/ref/forms/fields/#modelchoicefield

36

在使用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

84

你可以设置一个自定义的 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)

更多信息可以在 这里 找到。

撰写回答