2012-06-05 3 views
11

Sono abbastanza nuovo per Django e ho letto la documentazione sui suoi modelli relazionali e moduli di amministrazione in linea (docs on InlineModelAdmin) Sto cercando di capire se è possibile che il seguente sia possibile scatola, o se dovessi tirare le mie forme.Aggiunta in linea di molti a molti oggetti nell'amministratore di Django

Diciamo che ho due oggetti: film e registi, questa è una relazione molti-a-molti come definito nelle dichiarazioni modello come segue:

class Film(Model): 
    director = ManyToManyField('Director') 

Ora, nel modulo di dettaglio per un oggetto Film Vorrei aggiungere oggetti Director inline (hanno solo un campo nome come unica proprietà). Non basta selezionare istanze esistenti, ma essere in grado di creare , in linea sotto forma di oggetto Film.

class DirectorInline(admin.TabularInline): 
    model = Director 
    extra = 3 


class FilmAdmin(admin.ModelAdmin): 
    inlines = (
     DirectorInline, 
     ) 

Questo genera un errore, perché si aspetta una chiave esterna per l'oggetto direttore. È ciò che sto cercando di ottenere possibile senza creare un modulo personalizzato, un validatore, ecc.? Tutti i suggerimenti nella giusta direzione sarebbero molto apprezzati, grazie in anticipo.

risposta

20

Il widget predefinito per il campo molti a molti in admin o widget con proprietà filter_vertical o filter_horizontal consente di aggiungere un nuovo elemento. C'è un segno "+" verde vicino al campo per aprire una finestra popup e aggiungere una nuova istanza Director.

Ma se è necessario l'amministratore in linea, fare riferimento allo through-model. Se non si specifica il modello personalizzato, Django crea un modello semplice con 2 chiavi esterne per Director e Film.

Così si può cercare di creare in linea come

class DirectorInline(admin.TabularInline): 
    model = Film.director.through 
    extra = 3 

Questo non solleverà un'eccezione e genererà una forma in linea, ma si dovrà selezionare i direttori dalla lista a discesa. Penso che puoi sovrascrivere questo utilizzando il modulo personalizzato.

+0

Igor, (o chiunque altro), come aggiungeresti le opzioni in linea come i campi? – Greg

+2

@Greg Non capisco davvero cosa cerchi di ottenere. Se si desidera salvare ulteriori dati nel modello M2M, è possibile utilizzare il modello personalizzato attraverso: https://docs.djangoproject.com/en/1.6/topics/db/models/#intermediary-manytomany Se si desidera aggiungere solo campi al pannello di amministrazione, è possibile ridefinire '' DirectorInline.form'' – Igor

+0

@Igor Come ridefinire Inline.form? – mamasi