2009-11-16 33 views
48

我正在組建一個satchmo應用程序的管理員。 Satchmo使用OneToOne關係來擴展基地Product模型,並且我想在一頁上進行編輯。Django Admin:一對一關係作爲內聯?

可以將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',) 

回答

65

這是完全可以使用內嵌的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) 
+2

不幸父模型已經與管理員登記,我寧願不走下車修補/分叉的Satchmo本身 – Jiaaro 2009-11-16 20:15:41

+2

見我進一步解釋 – 2009-11-16 20:30:23

+4

哦,親小費! = D – Jiaaro 2009-11-17 13:17:19

4

參考最後一個問題,多種子類型的最佳解決方案是什麼。 E.g類具有子類型Book和子類CD的產品。此處顯示的方式必須編輯產品的一般項目,以及書籍的子類型項目和CD的子類型項目。所以,即使您只想添加一本書,您也可以獲得CD的字段。如果您添加了一個子類型,例如DVD中,您會看到三個子類型的字段組,但實際上您只需要一個子類型組,如上所述:書籍。

5

也許使用繼承,而不是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) 

在這個變型產品將成爲在線。

+1

你可以擴展一下嗎?目前還不清楚這是怎麼回事 – bryanph 2015-11-04 09:17:47