2012-06-13 3 views
7

I miei modelli:accesso molti a molti "attraverso" campi di relazione in formsets

class End_User(models.Model): 
    location = models.ForeignKey(Location) 
    first_name = models.CharField(max_length=70, blank=True, null=True) 
    email_address = models.CharField(max_length=70, blank=True, null=True) 

class Phone_Client(models.Model): 
    end_user = models.ManyToManyField(End_User) 
... 
    extensions = models.CharField(max_length=20) 

class Line(models.Model): 
    phone_client = models.ManyToManyField(Phone_Client, through='Phone_Line') 
    .... 
    voicemail = models.BooleanField(default=False) 

class Phone_Line(models.Model): 
    phone_client = models.ForeignKey(Phone_Client) 
    line = models.ForeignKey(Line) 
    line_index = models.IntegerField() 

Quindi, in pratica un utilizzatore finale può avere molti telefoni, un telefono cellulare può avere molte linee, connessi attraverso Phone_line.

La mia pagina deve avere tutti questi oggetti modificabili e nuove istanze create runtime per Phone_Clients e Line tutti nella stessa pagina. Attualmente sto creando un semplice modulo modello End_User e oggetti modelformset_factory per Phone_Client e Lines. Poiché un telefono può avere più linee, ogni modulo telefonico in phone_formset può avere un oggetto formset di riga. Attualmente sto facendo qualcosa di simile

end_user = End_User.objects.get(pk=user_id) 
user_form = End_UserForm(instance=end_user) 

Phone_ClientFormSet = modelformset_factory(Phone_Client,form=PartialPhone_ClientForm, extra=0, can_delete=True) 

phone_clients_formset = Phone_ClientFormSet(queryset=end_user.phone_client_set.all(), prefix='phone_client') 

all_lines = modelformset_factory(Line, form=PartialLineForm, extra=0, can_delete=True) 

phone_clients = end_user.phone_client_set.all() 

client_lines_formsets = {} 
for phone in phone_clients: 
    client_lines_formsets[phone.id] = all_lines(queryset=phone.line_set.all(), prefix='phone_client_'+str(phone.id)) 

Sto usando questo elenco per visualizzare le linee appartenenti ad un phone_client nel modello utilizzando formsets.

Ho la seguente domanda, sui modelli

  1. Posso usare fabbrica inline_formset per gestire molti a molti relazione contenente un bel passaggio di classe? In tal caso, come faccio a farlo per Phone_Client, Line e Phone_Line attraverso la relazione?

  2. Devo visualizzare l'indice di riga per un determinato telefono, combinazione di linee, come faccio a farlo nel modello? Ho visto
    How do I access the properties of a many-to-many "through" table from a django template? Non voglio solo visualizzare, ma associare il valore al telefono, combinazione di linee, se possibile, nel formset di linea o telefono, in modo tale che se l'utente cambia l'indice, posso salvarlo nei dati base durante la pubblicazione dei dati del formset.

Sono nuovo del django quindi ogni aiuto è molto apprezzato. Grazie !!

risposta

14

Come probabilmente saprete, non è possibile modificare le relazioni molti-a-molti con i moduli in linea. Tuttavia, è possibile modificare il modello passante. Quindi per la vostra formset linea, non vi resta che impostare il modello per il tramite del modello, ad es .:

inlineformset_factory(Phone_Client, Line.phone_client.through) 

line_index sarà effettivamente un campo visibile nel modulo in linea, in modo che davvero non c'è bisogno di fare nulla. Se qualcuno cambia l'indice, verrà salvato quando i moduli in linea vengono salvati, proprio come il resto dei campi.

+0

Grazie per la risposta. Lo proverò !! – akotian

+0

Ho provato questo e funziona per me. Comunque una domanda, dovrei gestire separatamente il formset Line e il formset inline sopra a destra ?? – akotian

+0

Intendo che una pagina può avere più telefoni, che possono avere più linee, quindi gestisco questa logica nel modello. Allo stesso modo dovrei usare i template per mostrare line_index accanto alle linee? – akotian