我将satchmo应用程序的管理员放在一起。 Satchmo使用OneToOne关系来扩展基本Product
模型,我想在一页上全部进行编辑。
可以将OneToOne关系作为内联吗?如果不是,最好的方法是在管理员的给定页面中添加一些字段,这些字段最终将保存到OneToOne关系中?
例如:
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(models.Model):
product = models.OneToOne(Product)
...
我为管理员尝试了此操作,但是它不起作用,并且似乎期望使用外键:
class ProductInline(admin.StackedInline):
model = Product
fields = ('name',)
class MyProductAdmin(admin.ModelAdmin):
inlines = (AlbumProductInline,)
admin.site.register(MyProduct, MyProductAdmin)
引发此错误:
<class 'satchmo.product.models.Product'> has no ForeignKey to <class 'my_app.models.MyProduct'>
唯一的方法是Custom Form吗?
编辑:刚刚尝试使用以下代码直接添加字段...也不起作用:
class AlbumAdmin(admin.ModelAdmin):
fields = ('product__name',)
最佳答案
将内联用于OneToOne关系是完全可能的。但是,定义关系的实际字段必须位于内联模型上,而不是父模型上-与外键相同。切换它,它将起作用。
在评论后编辑:您说父模型已经向管理员注册:然后取消注册并重新注册。
from original.satchmo.admin import ProductAdmin
class MyProductInline(admin.StackedInline):
model = MyProduct
class ExtendedProductAdmin(ProductAdmin):
inlines = ProductAdmin.inlines + (MyProductInline,)
admin.site.unregister(Product)
admin.site.register(Product, ExtendedProductAdmin)
更新2020(Django 3.1.1)
此方法仍然有效,但是新的 Django 版本中的某些类型已更改,因为现在应将
inlines
中的ExtendedProductAdmin
添加为列表而不是元组,例如:class ExtendedProductAdmin(ProductAdmin):
inlines = ProductAdmin.inlines + [MyProductInline]
否则您将得到此错误: inlines = ProductAdmin.inlines + (MyProductInline,)
TypeError: can only concatenate list (not "tuple") to list