2016-03-31 16 views
0

Ich habe drei Modelle: Buch, Sprachen und Optionen. Es gibt vordefinierte Sätze von Büchern (Master und Margarita, Der Name der Rose etc.) und Sprachen (Englisch, Deutsch, Französisch und so weiter). Jede Book-Instanz hat eine vordefinierte Teilmenge von Sprachen, in denen verfügbar ist (ManyToMany-Beziehung). Das Optionsmodell enthält das Feld Buch (als ForeignKey) und das Feld Sprachen (ManyToMany). Ich möchte ein Formular erstellen, das es dem Benutzer ermöglicht, ein beliebiges Buch auszuwählen und (nach der Auswahl) Sprachen dynamisch zu filtern, um nur eine Teilmenge anzuzeigen, die mit diesem Buch in Beziehung steht. Ist das mit Django möglich?Django - Filterformularfeldsatz basierend auf einem anderen Feld

Relevante Modelle:

class Book (models.Model): 
    title = models.CharField (max_length = 128) 
    languages = models.ManyToManyField (Language, related_name = 'available_languages') 

class Language (models.Model): 
    name = models.CharField (max_length=64) 
    abbreviation = models.CharField (max_length=4) 

class Options (models.Model): 
    book = models.ForeignKey (Book, help_text = 'Text', null = True, blank = True) 
    languages = models.ManyToManyField (Language, related_name = 'languages', help_text = 'Languages') 

Antwort

0

Sie können dies tun, mit vielen Möglichkeiten, eine der einfachsten ist man mit django-smart-selects App, die speziell sehr gut integrieren, wenn Sie django Admin verwenden. Alles, was Sie tun müssen, ist zu install the app und Ihr Modell aktualisieren:

from smart_selects.db_fields import ChainedManyToManyField 


class Options (models.Model): 
    book = models.ForeignKey(Book, help_text='Text', null=True, blank=True) 
    languages = ChainedManyToManyField(Language, related_name='languages', help_text='Languages' 
             chained_field="book", 
             chained_model_field="languages") 
+1

Danke! Es funktionierte nicht aus der Box, ich musste ManyToManyField von Book zu Language verschieben, daher sieht das Feld 'Optionen' wie folgt aus: 'languages ​​= ChainedManyToManyField (Sprache, chained_field =" book ", chained_model_field =" books ") '. Aber es funktioniert jetzt perfekt! – user1785295

0

Sie können es über AJAX machen. Wenn der Benutzer ein Buch auswählt, rufen Sie die URL Ihrer Ansicht in Django auf.

Die Ansicht wird ein Formular mit ID des Buches den Benutzer ausgewählt, dann wird nur die HTML für das gewünschte Formular zurückgeben. Dann, in der Ajax-Erfolg, legen Sie das HTML-Formular, wo Sie es wollen.

+0

Ich vermutete, dass AJAX die Antwort ist, aber ich bin nicht wirklich damit vertraut, und würde lieber vermeiden, neue Technologie im Moment zu lernen, @Mounir Antwort funktioniert für mich. Danke trotzdem! – user1785295

+0

Ich denke, es ist wirklich sehr einfach, dies mit AJAX zu machen, und es wird Ihnen in Zukunft viel helfen. Ich hoffe du kannst es eine Chance geben;) –

Verwandte Themen