小编典典

Django Admin:作为内联的一对一关系?

python

我将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'>

这样做的唯一方法是自定义表单吗?

编辑: 刚刚尝试下面的代码直接添加字段…也不起作用:

class AlbumAdmin(admin.ModelAdmin):
    fields = ('product__name',)

阅读 216

收藏
2020-12-20

共1个答案

小编典典

将内联用于OneToOne关系是完全可能的。但是,定义关系的实际字段必须位于内联模型上,而不是父模型上-与外键相同。切换它,它将起作用。

注释后编辑 :您说父模型已经在admin中注册:然后注销它并重新注册。

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
版本中的某些类型已更改,因为inlinesinExtendedProductAdmin现在应该作为列表而不是元组添加,如下所示:

class ExtendedProductAdmin(ProductAdmin):
    inlines = ProductAdmin.inlines + [MyProductInline]

否则您将得到此错误:

    inlines = ProductAdmin.inlines + (MyProductInline,)
TypeError: can only concatenate list (not "tuple") to list
2020-12-20