我正在把一个satchmo应用程序的管理。Product
使用OneToOne关系来扩展基本的Satchmo模型,我想在一个页面上对其进行编辑。
可以将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',)
发布于 2009-11-17 03:49:50
在OneToOne关系中使用内联是完全可能的。然而,定义关系的实际字段必须在内联模型上,而不是在父级模型上-就像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)
更新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
发布于 2012-09-28 20:42:57
可以使用继承而不是OneToOne关系
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)
在这个变种中,你的产品将是内联的。
发布于 2010-03-14 08:24:43
关于最后一个问题,对于多个子类型,什么是最好的解决方案。例如,class Product包含子类型的class和子类型的class CD。按照这里所示的方法,您必须编辑一个产品,一般项加上图书的子类型项和CD的子类型项。因此,即使您只想添加一本书,也会获得CD字段。如果您添加子类型,例如DVD,您将获得三个子类型字段组,而您实际上只需要一个子类型组,在前面提到的示例中:book。
https://stackoverflow.com/questions/1744203
复制相似问题