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',)
War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top