如何在django admin foreignkey下拉列表中更改显示文本

时间:2010-06-18 16:27:07

标签: django django-admin

我有一个任务列表,可以分配用户。所以我在数据库中有用户模型的外键。但是,默认显示是下拉菜单中的用户名,我想显示全名(最后一个)而不是用户名。如果foreignkey指向我自己的一个类,我只能更改模型中的 str 函数,但User是django身份验证模型,所以我不能轻易直接更改它? / p>

任何人都知道如何做到这一点?

非常感谢!

3 个答案:

答案 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作为基础的更通用的详细解决方案。避免摆弄查询集,只专注于修改下拉列表中的可见值。

  1. 创建您自己的表单域:
class CustomLabelChoiceField(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         return "Howdy {}".format(obj.name)
  1. 将其与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