如何在Django admin中显示来自其他模型的只读数据?

2024-09-28 03:14:30 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么当我从方法car_name调用模型实例时,该方法在Django admin中返回-

@admin.register(Invoice)
class CarProductDataAdmin(admin.ModelAdmin):
    form = CarProductDataAdminForm

    def car_name(self, obj):
        # Call this instance 
        car = Customer.objects.get(product__customer_id=self.request.user.person.id)
        return "car.name"  # return string

    readonly_fields = ('car_name', )

但当我返回字符串时,它是工作

@admin.register(Invoice)
class CarProductDataAdmin(admin.ModelAdmin):
    form = CarProductDataAdminForm

    def car_name(self, obj):
        # Doesn`t Call this instance 
        # return string
        return "name"

    readonly_fields = ('car_name', )


Tags: 方法nameselfformregisterobjreturnadmin
2条回答

代码中第一个值得注意的问题是,返回的不是对象属性值,而是字符串:

return "car.name"  # return string

应该是:

return f"{car.name}"

或者,根据您使用的python版本:

return f"{}".format(car.name)

下一个问题是,在模型管理器上调用get应该会导致DoesNotExists异常,但在某些情况下,它可能会被抑制,因此我建议将代码修改为:

try:
    car = Customer.objects.get(product__customer_id=self.request.user.person.id)
    return f"{car.name}" 
except Customer.DoesNotExists:
    return "None"

看看这是你想要的还是“没有”

根据我的判断,django管理员在方法(用作字段)中遇到异常时似乎会无声地失败

在第一个示例中,问题似乎是self.request,因为CarProductDataAdmin实例没有request属性。因此,不会引发异常,而是不会向字段返回任何值,从而导致输出“-”

如果您需要request,您必须从某处获取它,并将其保存在ModelAdmin中以供重复使用。可能通过覆盖ModelAdmin的get_form方法

class CarProductDataAdmin(admin.ModelAdmin):

# ....

    def get_form(self, request, obj=None, change=False, **kwargs):
        self.request = request
        return super().get_form(request, obj, change, **kwargs)

然后您应该能够使用代码中发布的car_name方法

相关问题 更多 >

    热门问题