将Django ModelChoiceField改为显示用户全名而非用户名
我在我的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)
更多信息可以在 这里 找到。