我正在把一个Satchmo应用程序的管理员放在一起.Satchmo使用ONETOONE关系来扩展基础Product模型,我想在一个页面上对其进行编辑.

是否可以将一对一关系作为内联关系?如果不是,向我管理的给定页面添加几个字段的最佳方式是什么,这些字段最终将保存到ONETOONE关系中?

例如:

class Product(models.Model):
    name = models.CharField(max_length=100)
    ...

class MyProduct(models.Model):
    product = models.OneToOne(Product)
    ...

我为我的管理员try 了这个,但它不起作用,似乎需要外键:

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吗?

edit:刚刚try 了以下代码直接添加字段...也不起作用:

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

推荐答案

对一对一关系使用内联是完全可能的.但是,定义关系的实际字段必须位于内联模型上,而不是位于父级模型上-与ForeignKey的方式相同.把它换一下,它就能用了.

Edit after comment:你说父模型已经向管理员注册了:然后取消注册并重新注册.

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)

Update 2020 (Django 3.1.1)

此方法仍然有效,但新Django版本中的某些类型已更改,因为ExtendedProductAdmin中的inlines现在应添加为列表,而不是元组,如下所示:

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

否则,您将收到此错误:

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

Django相关问答推荐

在Django URL模式中使用多个空路由可以吗?

在生产中添加整型主键

Django中每个类型/代理的最新行

获取 Django (postgres) 中带注释字段的平均值

Django 隐藏特定人员的媒体文件链接

无法迁移,模型中的外键导致了问题

在 Django 4.1 中提交表单之前显示数据

如何将多个模型添加到单个列表视图?

root urls.py 是 Django 中的 config/urls.py 吗?

Django 模型 Select - 只允许管理界面上的特定转换

如何使用 matplotlib 在绘图的角落插入小图像?

Django:在模板中显示当前语言环境

断开模型的信号并在 django 中重新连接

__init__() 得到了一个意外的关键字参数user

Django模板转义

UnicodeEncodeError:ascii编解码器无法编码字符

如何以编程方式对 Django 中的用户进行身份验证?

Django Admin:如何在内联中显示模型上定义的属性?

BASE DIR 的绝对路径是什么?

如何从 django 请求中获取完整的 url