【问题标题】:how to change display text in django admin foreignkey dropdown如何在 django admin 外键下拉列表中更改显示文本
【发布时间】:2011-03-05 12:36:59
【问题描述】:

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

有谁知道如何做到这一点?

非常感谢!

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    您可以为您的 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
    

    【讨论】:

    • 如果数据库中的用户列表发生变化怎么办?
    • @benzkji 此处的示例并未解决此问题,因此也不应该按原样使用。 ChoiceFieldchoices 参数接受两个元组的可迭代(如此处所示),以及返回此类可迭代的可调用对象。后一种选择是您想要的实际生产代码。
    • 那么为什么不提供一个生产就绪的代码呢?高水平咆哮,我知道;-)
    • @benzkji 我想没有真正的理由不这样做。答案的初衷是表明您可以为您的管理类创建自己的表单,而不是如何提供实际值(除了显示所需的结构)。将源代码更改为可调用对象并不会使其变得更加复杂,并且确实提供了一个更易于生产的示例。感谢您的建议:)
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      使用 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
      

      【讨论】:

        猜你喜欢
        • 2016-11-12
        • 2012-07-05
        • 2017-04-06
        • 2011-10-13
        • 2018-10-27
        • 2019-01-21
        • 2016-10-31
        • 1970-01-01
        • 2011-04-29
        相关资源
        最近更新 更多