Djangopipe理员:OneToOne关系作为内联?
我正在把一个satchmo应用程序的pipe理员放在一起。 Satchmo使用OneToOne关系来扩展基本Product
模型,并且我想在一页上进行编辑。
一个OneToOne关系可以作为一个Inline吗? 如果不是,最好的方法是添加几个字段到我的pipe理员的一个给定的页面,最终将被保存到OneToOne关系?
例如:
class Product(models.Model): name = models.CharField(max_length=100) ... class MyProduct(models.Model): product = models.OneToOne(Product) ...
我试过这个我的pipe理员,但它不工作,似乎期望一个外键:
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',)
OneToOne关系使用内联是完全可能的。 但是,定义关系的实际字段必须在内联模型上,而不是在父模型上 – 就像对于ForeignKey一样。 切换它,它会工作。
在评论之后编辑 :你说父模型已经注册了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)
也许使用inheritance而不是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)
在这个变体中,你的产品将是内联的。
提到最后一个问题,多种子types的最佳解决scheme是什么? 例如,具有子typesBook和子typesCD的类Product。 在这里显示的方式,你将不得不编辑产品的一般项目加上书的子types的项目和CD的子types的项目。 所以,即使你只想添加一本书,你也可以得到CD的字段。 如果添加一个子types(例如DVD),则会在您提到的示例中获得三个子types的字段组,但实际上您只需要一个子types组:书籍。
您也可以尝试在OneToOneField上设置“parent_link = True”?
https://docs.djangoproject.com/en/dev/topics/db/models/#specifying-the-parent-link-field