如何在 select 字段 django admin 中显示不同的列?

How to show different column in select field django admin?

我有一个模特客户:

class Customer(models.Model):
    customer_name = models.CharField(max_length=128, null=True)
    contact_name = models.CharField(max_length=64)

    def __str__(self) -> str:
        return self.customer_name

Customer 模型通过 ForiegnKey 与 Event 和 CustomerEvent 模型相关联。 在 Django 管理面板中,我们喜欢在带有事件的下拉列表中显示 customer_name,它工作正常,因为 Customer 对象 str 表示是 self.customer_name。 但是在 CustomerEvent 中,我们希望在管理面板下拉列表中显示 contact_name,这不在 __str__ 表示中。

这是我的示例代码:

def render_change_form(self, request, context, *args, **kwargs):
         context['adminform'].form.fields['customer'].queryset = Customer.objects.filter(customer_type__iexact='I')
         return super(CustomerEventAdmin, self).render_change_form(request, context, *args, **kwargs)

请给我一些制作的想法。

我得到了答案:

我只是覆盖了 formfield_for_foreignkey 方法,现在它看起来像:

def formfield_for_foreignkey(self, db_field, request, **kwargs):
        formfield = super().formfield_for_foreignkey(db_field, request, **kwargs)
        if db_field.name == 'customer':
            formfield.label_from_instance = lambda obj: obj.contact_name
        return formfield