如何在Django Admin面板中显示订单关联的product_name与customer_name
解决Django Admin中订单关联的商品/客户名称无法正常展示的问题
这个问题我之前也碰到过,本质是Django里ForeignKey字段在Admin列表中的显示逻辑导致的:默认情况下,关联模型会调用自身的__str__()方法返回字符串,如果你的Product和Customer模型没定义这个方法,Admin就会显示类似<Product object>的默认占位符,看起来像是没展示出名称。
下面给你两种可行的解决方案,按需选择:
方案一:给关联模型添加__str__()方法(全局生效)
这是最推荐的方式,因为它会让所有引用Product或Customer对象的地方都显示名称,而不只是Admin面板。
修改你的models.py,给Product和Customer模型添加__str__()方法:
class Product(models.Model): # 假设你的Product模型有name字段(如果字段名不同,替换成你实际的字段,比如title) name = models.CharField(max_length=100) # 其他原有字段... def __str__(self): return self.name # 返回商品名称 class Customer(models.Model): # 假设你的Customer模型有name字段 name = models.CharField(max_length=100) # 其他原有字段... def __str__(self): return self.name # 返回客户名称
修改后重启Django服务,刷新Admin面板,就能看到list_display里的product和customer列正常显示名称了。
方案二:在Admin类中自定义显示方法(仅Admin列表生效)
如果不想修改模型的全局__str__行为,或者需要在Admin里展示关联模型的其他属性,可以在AdminOrders类中添加自定义方法:
修改你的admin.py:
class AdminOrders(admin.ModelAdmin): # 替换原有list_display,用自定义方法代替直接的product/customer字段 list_display = ['get_product_name', 'get_customer_name', 'quantity', 'address', 'phone', 'price', 'date', 'status'] def get_product_name(self, obj): # 这里的name替换成你Product模型中存储商品名称的实际字段名 return obj.product.name # 设置Admin列表中该列的显示名称 get_product_name.short_description = '商品名称' def get_customer_name(self, obj): # 这里的name替换成你Customer模型中存储客户名称的实际字段名 return obj.customer.name get_customer_name.short_description = '客户名称'
同样重启服务后,Admin列表就会显示对应的商品和客户名称了。
内容的提问来源于stack exchange,提问作者Akash Singh
相关产品推荐
相关产品推荐

