Django Admin: OneToOne Relation als Inline?
-
20-09-2019 - |
Frage
Ich stelle den Admin für eine satchmo Anwendung zusammen. Satchmo verwendet OneToOne Beziehungen die Basis Product
Modell zu erweitern, und ich würde es gerne bearbeiten alle auf einer Seite.
Es ist möglich, eine OneToOne Beziehung als Inline zu haben? Wenn nicht, was ist der beste Weg, um ein paar Felder zu einer bestimmten Seite meines Admin hinzuzufügen, die schließlich in die OneToOne Beziehung gerettet werden?
Beispiel:
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(models.Model):
product = models.OneToOne(Product)
...
Ich habe versucht, dies für meinen Admin aber es funktioniert nicht, und scheint einen Fremdschlüssel zu erwarten:
class ProductInline(admin.StackedInline):
model = Product
fields = ('name',)
class MyProductAdmin(admin.ModelAdmin):
inlines = (AlbumProductInline,)
admin.site.register(MyProduct, MyProductAdmin)
Welche diesen Fehler führt: <class 'satchmo.product.models.Product'> has no ForeignKey to <class 'my_app.models.MyProduct'>
Ist der einzige Weg, dies eine Custom Form ?
Bearbeiten versucht einfach den folgenden Code die Felder direkt hinzufügen ... tut auch nicht:
class AlbumAdmin(admin.ModelAdmin):
fields = ('product__name',)
Lösung
Es ist durchaus möglich, ein Inline für eine OneToOne Beziehung zu verwenden. Allerdings hat das tatsächliche Feld definieren die Beziehung auf dem Inline-Modell, nicht derjenige Elternteil - in genau der gleichen Weise wie für eine ForeignKey. Schalten Sie es immer und es wird funktionieren.
Bearbeiten nach Kommentar : Sie sagen, dass das übergeordnete Modell bereits mit dem Server-Betreiber registriert ist. Dann austragen es und registrieren
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)
Andere Tipps
Mit Bezug auf die letzte Frage, was die beste Lösung für mehrere Untertypen sein würde. Z. B-Klasse Produkt mit Untertypklasse Buch und Untertyp der Klasse CD. Die Art und Weise gezeigt, hier würde man ein Produkt der allgemeinen Elemente sowie die Sub-Typ Artikel für Buch und die Untertyp Elemente für CD bearbeiten müssen. Also selbst wenn Sie nur ein Buch hinzufügen möchten Sie erhalten auch die Felder für CD. Wenn Sie einen hinzufügen Untertypen z.B. DVD, erhalten Sie drei Unterfeldgruppen, während Sie eigentlich nur eine Untertyp-Gruppe wollen, in dem oben genannten Beispiel: Bücher
.Vielleicht Vererbung Verwendung anstelle OneToOne Beziehung
class Product(models.Model):
name = models.CharField(max_length=100)
...
class MyProduct(Product):
.....
oder verwenden Proxy-Klassen
class ProductProxy(Product)
class Meta:
proxy = True
in 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)
Bei dieser Variante Ihr Produkt in inline sein wird.
Sie können auch versuchen, Einstellung 'parent_link = True' auf Ihrer OneToOneField?
https: // docs .djangoproject.com / en / dev / Themen / db / models / # Angabe-the-Eltern-Link-Feld