2009-11-16 14 views
48

Sto assemblando l'amministratore per un'applicazione satchmo. Satchmo utilizza le relazioni OneToOne per estendere il modello base Product e vorrei modificarlo tutto in un'unica pagina.Django Admin: OneToOne Relazione come Inline?

È possibile avere una relazione OneToOne come Inline? In caso contrario, qual è il modo migliore per aggiungere alcuni campi a una determinata pagina del mio amministratore che alla fine verranno salvati nella relazione OneToOne?

ad esempio:

class Product(models.Model): 
    name = models.CharField(max_length=100) 
    ... 

class MyProduct(models.Model): 
    product = models.OneToOne(Product) 
    ... 

Ho provato questo per la mia amministrazione, ma non funziona, e sembra aspettarsi una chiave esterna:

class ProductInline(admin.StackedInline): 
    model = Product 
    fields = ('name',) 

class MyProductAdmin(admin.ModelAdmin): 
    inlines = (AlbumProductInline,) 

admin.site.register(MyProduct, MyProductAdmin) 

che getta questo errore: <class 'satchmo.product.models.Product'> has no ForeignKey to <class 'my_app.models.MyProduct'>

L'unico modo per farlo è un Custom Form?

edit: appena provato il seguente codice per aggiungere i campi direttamente ... anche non funziona:

class AlbumAdmin(admin.ModelAdmin): 
    fields = ('product__name',) 

risposta

65

E 'perfettamente possibile utilizzare una linea per un rapporto OnetoOne. Tuttavia, il campo effettivo che definisce la relazione deve essere sul modello in linea, non su quello genitore, proprio come per un ForeignKey. Passa e funzionerà.

Modifica dopo commento: si dice che il modello principale è già registrato con l'amministratore: quindi annullare la registrazione e registrarsi di nuovo.

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

purtroppo il modello di genitore è già registrato con admin, e preferirei non andare fuori patch/biforcano Satchmo stesso – Jiaaro

+2

Vedere il mio ulteriori spiegazioni –

+4

oh, pro-tip! = D – Jiaaro

4

In riferimento all'ultima domanda, quale sarebbe la soluzione migliore per più sottotipi. Classe E.g Prodotto con sottotipo di classe Libro e sottotipo di classe CD. La modalità illustrata qui dovrebbe modificare un prodotto per gli elementi generali più gli elementi di sottotipo per il libro E gli elementi di sottotipo per il CD. Quindi, anche se vuoi solo aggiungere un libro, ottieni anche i campi per il CD. Se aggiungi un sottotipo, ad es. DVD, ottieni tre gruppi di campi di sottotipo, mentre in realtà vuoi solo un gruppo di sottotipi, nell'esempio menzionato: libri.

5

Forse usare l'ereditarietà invece rapporto OnetoOne

class Product(models.Model): 
    name = models.CharField(max_length=100) 
    ... 

class MyProduct(Product): 
    ..... 

o utilizzare le classi proxy

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) 

In questa variante il prodotto sarà in linea.

+1

Potresti espanderlo? Non mi è chiaro cosa sta succedendo – bryanph

Problemi correlati