我有一个任务列表,可以分配用户。所以我在数据库中有用户模型的外键。但是,默认显示是下拉菜单中的用户名,我想显示全名(最后一个)而不是用户名。如果foreignkey指向我自己的一个类,我只能更改模型中的 str 函数,但User是django身份验证模型,所以我不能轻易直接更改它? / p>
任何人都知道如何做到这一点?
非常感谢!
答案 0 :(得分:3)
您可以为任务模型创建一个新的ModelForm,它会显示您喜欢的用户列表(此处的代码假设一个名为Task的模型具有'user'属性):
def get_user_full_name_choices:
return [(user, user.get_full_name()) for user in User.objects.all()]
class TaskAdminForm(forms.ModelForm):
class Meta:
model = Task
user = forms.ChoiceField(choices=get_user_full_name_choices)
然后,告诉您的ModelAdmin类使用新表单:
class TaskAdmin(admin.ModelAdmin):
form = TaskAdminForm
答案 1 :(得分:2)
还有另一种选择:
USERS = [(user.id, user.get_full_name()) for user in User.objects.all()]
USERS.insert(0, ('', '----'))
class TaskAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(TaskAdminForm, self).__init__(*args, **kwargs)
self.fields['user'].choices=USERS
答案 2 :(得分:1)
使用ModelChoiceField作为基础的更通用的详细解决方案。避免摆弄查询集,只专注于修改下拉列表中的可见值。
class CustomLabelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return "Howdy {}".format(obj.name)
class TaskAdminForm(forms.ModelForm):
user = CustomLabelChoiceField(queryset=User.objects.all()
class Meta:
model = Task
# obviously, link it with your admin
class TaskAdmin(admin.ModelAdmin):
form = TaskAdminForm