首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django Admin:作为内联的OneToOne关系?

Django Admin:作为内联的OneToOne关系?
EN

Stack Overflow用户
提问于 2009-11-17 03:10:26
回答 4查看 40.6K关注 0票数 72

我正在把一个satchmo应用程序的管理。Product使用OneToOne关系来扩展基本的Satchmo模型,我想在一个页面上对其进行编辑。

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

例如:

代码语言:javascript
运行
复制
class Product(models.Model):
    name = models.CharField(max_length=100)
    ...

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

我尝试了我的管理员,但它不工作,似乎需要一个外键:

代码语言:javascript
运行
复制
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

编辑:刚刚尝试了以下代码来直接添加字段...也不起作用:

代码语言:javascript
运行
复制
class AlbumAdmin(admin.ModelAdmin):
    fields = ('product__name',)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-17 03:49:50

在OneToOne关系中使用内联是完全可能的。然而,定义关系的实际字段必须在内联模型上,而不是在父级模型上-就像ForeignKey一样。把它换过来,它就能工作了。

注释后编辑:您说父模型已经注册到管理员:然后取消注册并重新注册。

代码语言:javascript
运行
复制
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版本中,一些类型发生了变化,因为ExtendedProductAdmin中的inlines现在应该作为列表而不是元组添加,如下所示:

代码语言:javascript
运行
复制
class ExtendedProductAdmin(ProductAdmin):
    inlines = ProductAdmin.inlines + [MyProductInline]

否则,您将得到以下错误:

代码语言:javascript
运行
复制
    inlines = ProductAdmin.inlines + (MyProductInline,)
TypeError: can only concatenate list (not "tuple") to list
票数 82
EN

Stack Overflow用户

发布于 2012-09-28 20:42:57

可以使用继承而不是OneToOne关系

代码语言:javascript
运行
复制
class Product(models.Model):
    name = models.CharField(max_length=100)
    ...

class MyProduct(Product):
    .....

或使用代理类

代码语言:javascript
运行
复制
class ProductProxy(Product)
    class Meta:
        proxy = True

在admin.py中

代码语言:javascript
运行
复制
class MyProductInlines(admin.StackedInline):
    model = MyProduct

class MyProductAdmin(admin.ModelAdmin):
    inlines = [MyProductInlines]

    def queryset(self, request):
        qs = super(MyProductAdmin, self).queryset(request)
        qs = qs.exclude(relatedNameForYourProduct__isnone=True)
        return qs

admin.site.register(ProductProxy, MyProductAdmin)

在这个变种中,你的产品将是内联的。

票数 9
EN

Stack Overflow用户

发布于 2010-03-14 08:24:43

关于最后一个问题,对于多个子类型,什么是最好的解决方案。例如,class Product包含子类型的class和子类型的class CD。按照这里所示的方法,您必须编辑一个产品,一般项加上图书的子类型项和CD的子类型项。因此,即使您只想添加一本书,也会获得CD字段。如果您添加子类型,例如DVD,您将获得三个子类型字段组,而您实际上只需要一个子类型组,在前面提到的示例中:book。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1744203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档