如何更改Django admin外键下拉框中的显示文本
我有一个任务列表,可以给用户分配任务。所以在数据库里,我有一个指向用户模型的外键。不过,默认情况下下拉菜单里显示的是用户名,我想把它改成显示全名(名和姓)。如果外键指向的是我自己定义的类,我可以直接在模型里修改str函数,但用户模型是Django的认证模型,我不能直接轻易地改对吧?
有没有人知道怎么做到这一点?
非常感谢!
4 个回答
1
这是一个更通用、更详细的解决方案,使用了ModelChoiceField作为基础。这样做可以避免对查询集的复杂操作,主要集中在修改下拉框中显示的值。
- 首先,创建你自己的表单字段:
class CustomLabelChoiceField(forms.ModelChoiceField):
def label_from_instance(self, obj):
return "Howdy {}".format(obj.name)
- 然后,可以通过formfield_for_dbfield来使用它(就像链接中提到的那样),或者在你的管理表单中更详细地使用:
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
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
4
你可以为你的任务模型创建一个新的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