代码之家  ›  专栏  ›  技术社区  ›  Jiaaro

Django Admin:OneToOne关系作为内联?

  •  57
  • Jiaaro  · 技术社区  · 15 年前

    我正在为satchmo应用程序整合管理员。Satchmo使用OneToOne关系扩展基础 Product

    有可能有一个OneToOne关系作为内联?如果没有,那么在我的管理员页面中添加几个字段并最终保存到OneTONE关系中的最佳方法是什么?

    例如:

    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',)
    
    4 回复  |  直到 12 年前
        1
  •  82
  •   Zat42    4 年前

    评论后编辑

    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)

    版本自 inlines 在里面 ExtendedProductAdmin 现在应添加为列表而不是元组,如下所示:

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

    否则您将得到以下错误:

        inlines = ProductAdmin.inlines + (MyProductInline,)
    TypeError: can only concatenate list (not "tuple") to list
    
        2
  •  9
  •   Alexey    12 年前

    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)
    

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

        3
  •  5
  •   Henri    15 年前

    关于最后一个问题,对于多个子类型,什么是最佳解决方案。例如,带有子类型分类簿和子类型分类CD的分类产品。按照这里显示的方式,您必须编辑一个产品,即常规项目加上book的子类型项目和CD的子类型项目。因此,即使您只想添加一本书,您也可以获得CD的字段。如果您添加一个子类型,例如DVD,您会得到三个子类型字段组,而实际上您只需要一个子类型组,在前面提到的示例中:books。

        4
  •  2
  •   stephendwolff    12 年前

    您还可以尝试在OneToOneField上设置“parent\u link=True”?

    https://docs.djangoproject.com/en/dev/topics/db/models/#specifying-the-parent-link-field