2016-06-05 17 views
1

Ich habe drei Modelle: Product, Product Class und Product Attributes. Wenn dem Benutzer nun eine Seite zum Erstellen eines neuen Produkts angezeigt wird, muss er/sie die Product Class aus einem Drop-down-Menü auswählen. Basierend auf dieser Auswahl muss Product Attributes dynamisch aktualisiert werden (mit AJAX) und dem Benutzer ermöglichen, bestimmte Informationen einzugeben.Ändern Django Form Felder basierend auf Benutzerauswahl

Zum Beispiel: Ein Produkttyp Automobiles sein könnte, in welchem ​​Fall der Benutzer Tyre Size, erforderlich sein sollte Fuel Tank Capacity eingeben usw. oder eine Art Produkt Electronics und der Benutzer erforderlich sein könnte RAM, Storage Capacity usw. eingeben .

Die Frage ist, wie man das in Django schafft. Meine Ansicht hat ein Produktformular, aber ich kann keine Attributfelder zu diesem Formular hinzufügen, da ich nicht weiß, was product class der Benutzer auswählen wird. Also im Grunde muss ich Formularfelder ändern (Attributfelder hinzufügen) basierend auf Benutzerauswahl. Wie mache ich das?

Derzeit sobald das Produkt gespeichert und geöffnet werden dann wieder für die Bearbeitung, Ich füge die entsprechenden Attributfelder mit dem Code:

def add_attribute_fields(self): 
    """ 
    For each attribute specified by the product class, this method 
    dynamically adds form fields to the product form. 
    """ 
    for attribute in self.instance.product_class.attributes.all(): 
     field = self.get_attribute_field(attribute) 
     if field: 
      self.fields['attr_%s' % attribute.code] = field 

Aber das beruht weitgehend auf der Produktinstanz bereits erstellt. Ich möchte, dass der Benutzer beim Erstellen eines neuen Produkts auch Daten eingeben kann. Wie gehe ich vor?

Antwort

0

Wenn der Benutzer wählt die ProductClass, könnten Sie gesendet (AJAX) die pk zu Django und auf dieser Grundlage hat Django die entsprechenden Eingabeformularfelder HTML zurückgeben, die regelmäßigen django.forms mit ihm zu machen.

Dann fügen Sie diesen HTML-Code in Ihr ursprüngliches Formular ein, so dass es dem Benutzer angezeigt wird.

Auf diese Weise haben Sie, wenn der Benutzer das Formular abschickt, "zwei Formulare in einem", die Sie wie gewohnt mit Django-Formularen bearbeiten können. Erstellen Sie zuerst die ProductClass und dann die abhängige ProductAttributes.

Wenn der Benutzer beim Ausfüllen des Formulars seine Meinung ändert, können Sie die dynamisch eingefügten Formularfelder entfernen und eine weitere AJAX-Anforderung an Django senden, um die Formularfelder für das neue ausgewählte ProductClass abzurufen.

Verwandte Themen