【发布时间】:2011-03-05 12:36:59
【问题描述】:
我有一个任务列表,可以分配用户。所以我在数据库中有用户模型的外键。但是,默认显示是下拉菜单中的用户名,我想显示全名(第一个最后一个)而不是用户名。如果外键指向我自己的一个类,我可以只更改模型中的 str 函数,但是 User 是 django 身份验证模型,所以我不能直接更改它对吗?
有谁知道如何做到这一点?
非常感谢!
【问题讨论】:
标签: django django-admin
我有一个任务列表,可以分配用户。所以我在数据库中有用户模型的外键。但是,默认显示是下拉菜单中的用户名,我想显示全名(第一个最后一个)而不是用户名。如果外键指向我自己的一个类,我可以只更改模型中的 str 函数,但是 User 是 django 身份验证模型,所以我不能直接更改它对吗?
有谁知道如何做到这一点?
非常感谢!
【问题讨论】:
标签: django django-admin
您可以为您的 Task 模型创建一个新的 ModelForm,它将显示您喜欢的用户列表(此处的代码假定一个名为 Task 的模型具有“用户”属性):
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
【讨论】:
ChoiceField 的 choices 参数接受两个元组的可迭代(如此处所示),以及返回此类可迭代的可调用对象。后一种选择是您想要的实际生产代码。
还有一个选择:
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
【讨论】:
使用 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
【讨论】: