2009-08-10 4 views
0

Ich habe ein Modell, das ungefähr so ​​aussieht:Laden und Daten von m2m Beziehungen in Textarea Widgets mit Modelform Speicher

class Business(models.Model): 
    name = models.CharField('business name', max_length=100) 
    # ... some other fields 
    emails = models.ManyToManyField(Email, null=True) 
    phone_numbers = models.ManyToManyField(PhoneNumber, null=True) 
    urls = models.ManyToManyField(URL, null=True) 

und eine entsprechende Modelform:

class BusinessContactForm(forms.ModelForm): 
    emails = forms.CharField(widget=forms.Textarea(attrs={'rows':4,'cols':32})) 
    phone_numbers = forms.CharField(widget=forms.Textarea(attrs={'rows':4,'cols':32})) 
    urls = forms.CharField(widget=forms.Textarea(attrs={'rows':4,'cols':32})) 

    class Meta: 
     model = Business 
     fields = ['emails', 'phone_numbers', 'urls',] 

Meine Frage: Was ist die Die beste Methode, um die vorhandenen E-Mails, Telefonnummern und URLs in die Textarea-Widgets zu laden, wenn das Formular angezeigt wird (eines pro Zeile in den entsprechenden Widgets)?

Dann, nachdem das Formular geändert und eingereicht wurde, was ist der beste Weg, um sicherzustellen, dass neue E-Mails, Zahlen oder URLs (m2m Beziehungen) hinzufügen und entfernen Sie alle, die nicht mehr in der Liste sind sicher, keine Duplikate hinzuzufügen)?

Antwort

1

Dies ist wirklich kein guter Weg, es zu tun. Der Umgang mit verwandten Artikeln auf Formularen ist, was formsets sind.

Anstatt die zugehörigen Felder als zusätzliche Felder im BusinessForm-Modell zu definieren, verwenden Sie ein Standardformular für einen Kontakt mit E-Mail, Telefon und URL. Übergeben Sie dies an die modelformset_factory, um ein Inline-Formularsatz für Ihr BusinessContact-Formular zu erstellen.

+0

Ich hatte über die Verwendung von Formsets nachgedacht, aber es schien, als wäre dies eine einfachere Benutzeroberfläche und sauberer Code insgesamt (vorausgesetzt, ich könnte es so ausführen, wie ich es mir vorgestellt habe - was selten der Fall ist). Das gesagt, ich hatte Formsets versucht, aber nicht so, dass ich für jedes der drei Elemente in der Ansicht (E-Mail, Telefon, URL) erstellen musste, und dann validieren und Daten von jedem auch behandeln. Sie erwähnen ein "Inline" -Formet für das BusinessContact-Formular - ist das eine spezielle Art von Formularsatz? Wenn ja, könntest du ein wenig weiterarbeiten? Vielen Dank! –

+0

Ich sollte auch beachten: Ich habe nicht ein Formularsatz mit allen drei Elementen erstellt, weil der Benutzer in der Lage sein soll, unterschiedliche Nummern von jedem (vielleicht ein oder zwei URLs, ein paar Telefonnummern und mehrere E-Mail-Adressen) anzugeben. –

+0

Also recherchierte ich Inline-Formsets, nachdem Sie sie erwähnt hatten (ich hatte die Dokumentation mehrere Male durchsucht und diesen Teil vermisst) und sie scheinen sich um all die Komplexitäten zu kümmern, die ich brauche ... Ich muss mit der Erstellung eines Formsets leben für jedes verwandte Feld und verschiebe sie in Viele-zu-Eins-Beziehungen. Danke für die Hilfe. –

1

Dies ist nicht direkt eine Antwort auf Ihre Frage. Es ist eher ein Vorschlag, Ihr Datenmodell zu überdenken.

Es scheint, als ob Ihre BusinessContactForm Textarea-Widgets zum Einfügen mehrerer Zeilen in die Datenbank darstellt. Ich würde ein Textarea-Widget nicht für mehrere Elemente mit eingeschränktem Typ verwenden: Ich würde Telefonnummern mit einem Telefonnummer-Widget, URLs mit einem URL-Widget und E-Mails mit einem E-Mail-Widget eingeben.

Ein Geschäftskontakt ist wirklich eine Person, die für ein Unternehmen arbeitet und eine E-Mail-Adresse und Telefonnummer hat, richtig? Warum also nicht den Geschäftskontakt so modellieren und einen ausländischen Schlüssel zum Geschäft haben?

Das ist mehr von dem Ansatz, den ich nehmen würde.

+0

Der Grund, warum ich es so gemacht habe, ist, dass die Kontaktinformationen nicht nur an eine Person gerichtet sind - zum Beispiel die E-Mail-Adresse [email protected] oder die Telefonnummer 1-800-busines Geschäft selbst und nicht eine bestimmte Person (was wäre, wenn sie ersetzt wurden?). Was ich im Sinn hatte, war, jede Zeile in ein Feld des entsprechenden Typs zur Validierung zu übergeben, aber das Problem, diese Verbindung zum DB-Objekt beizubehalten (wie ModelForm mit dem zugrundeliegenden Modell tut), wenn versucht wird, die Elemente nach der Validierung zu speichern, bleibt bestehen . –

+0

Also habe ich jedes Feld verschoben, um Tabellen mit Many-to-One-Beziehungen zu trennen. Siehe meinen Kommentar zur Antwort unten für Details. –

Verwandte Themen