Django管理员:作为内联的单点关系?

2024-04-25 07:32:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个satchmo应用程序召集管理员。Satchmo使用one to one关系来扩展基础Product模型,我想在一个页面上对其进行编辑。

有可能有一个一元关系作为内联?如果没有,那么向我的管理员的给定页面添加一些字段并最终保存到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',)

Tags: toname编辑admin关系models管理员页面
3条回答

最后一个问题是,对于多个子类型,什么是最好的解决方案。E、 g类产品有子类图书和子类光盘。在这里显示的方式,你将不得不编辑一个产品的一般项目加上书籍的子类型项目和CD的子类型项目。所以即使你只想添加一本书,你也可以得到CD的字段。如果添加子类型(如DVD),则会得到三个子类型字段组,而实际上只需要一个子类型组,在上述示例中为books。

也许用继承代替单一的关系

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

class MyProduct(Product):
    .....

或者使用代理类

class ProductProxy(Product)
    class Meta:
        proxy = True

在admin.py中

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)

在这个变体中,您的产品将处于内联状态。

完全有可能把内联用于一对一的关系。但是,定义关系的实际字段必须在内联模型上,而不是在父模型上,其方式与ForeignKey相同。把它调过来就行了。

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

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)

相关问题 更多 >