Djangoの管理者:インラインとしてOneToOne関係?
-
20-09-2019 - |
質問
私はサッチモアプリケーションの管理を一緒に入れています。サッチモは、ベースProduct
モデルを拡張するためにOneToOne関係を使用し、私は1つのページにそれをすべてを編集したいと思います。
インラインとして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'>
カスタムフォームを行うための唯一の方法です>?
の編集のも動作しません。ただ、...直接フィールドを追加するために、次のコードを試してみました。
class AlbumAdmin(admin.ModelAdmin):
fields = ('product__name',)
解決
これは、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)
他のヒント
複数のサブタイプのための最善の解決策になるか最後の質問を参照。サブタイプクラス予約すると例えば、クラスの製品とサブタイプのクラスCD。ここに示す方法は、あなたが製品に一般的な項目に加えブックのサブタイプのアイテムやCD用のサブタイプのアイテムを編集する必要があります。あなただけの本を追加したいので、場合でも、あなたもCDのフィールドを取得します。あなたは、サブタイプを追加する場合、例えばあなたが実際にのみ言及した例では、一つのサブタイプグループを望んながらDVD、あなたは、三つのサブタイプフィールドのグループを取得:図書
たぶん継承を使用する代わりに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)
この変形例では、あなたの製品は、インラインになります。
また、あなたのOneToOneFieldに 'parent_link = true' を設定してみることができますか?
ます。https://ドキュメント.djangoproject.com / ENは/ dev /トピック/ DB /モデル/#の指定-親リンクフィールドの