2017-07-12 9 views
0

Wenn wir ein ModelForm mit einigen Feldern haben, die nicht direkt mit dem Modell übereinstimmen, wie werden sie vom Formular benutzerdefiniert verarbeitet, während die übrigen Felder standardmäßig gespeichert werden?Django-Formular benutzerdefiniertes Feld

Zum Beispiel haben wir ein Modell für ein Objekt, das mehrsprachige Beschreibungen unterstützt. Die Modelle sind:

class Item(models.Model): 
    name = models.ForeignKey(Localization) 
    on_sale = models.BooleanField(default=False) 

class Localization(models.Model): 
    de = models.TextField(blank=True, null=True, verbose_name='de') 
    eng = models.TextField(blank=True, null=True, verbose_name='eng') 

Das Formular bearbeiten/hinzufügen ein Element sieht wie folgt aus:

class ItemForm(forms.ModelForm): 
    id = forms.CharField(widget=forms.HiddenInput(), max_length=128, label='') 
    name_eng = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:200px;'}), label='eng') 
    name_de = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:200px;'}), label='de') 
    on_sale = forms.CharField(widget=forms.CheckboxInput(), label='on_sale',) 

    class Meta: 
     model = Item 
     fields = ('id', 'on_sale',) 

Nun, was diese Form Spar tun sollte, ist für ein neues Element - Lokalisierung Objekt mit den beiden erstellen Benennen Sie Felder und erstellen Sie dann ein Objekt Objekt mit einem Feld "on_sale", das mit dem Objekt "Localization" verknüpft ist. Für ein vorhandenes Objekt - bearbeiten Sie das entsprechende Lokalisierungsobjekt und dann das Feld on_sale des Objekts.

Ich habe die Aufgabe mit einer separaten Funktion, die die benutzerdefinierten Felder aus der Anfrage getrennt verarbeitet, aber alles durch die save() - Methode des Formulars sieht besser aussieht. Oder liege ich falsch?

PS Es tut mir leid, eine offensichtlich abgenutzte Frage gestellt zu haben, aber ich versage einfach mit anderen Beispielen, was ich will.

Update:

ich es tatsächlich bekam arbeiten, um die Art, wie ich mit Hilfe der Hinweise von hier wollte. Code geht so, bitte lassen Sie mich wissen, wenn es optimiert werden kann.

class NameForm(forms.ModelForm): 
    # id = forms.CharField(widget=forms.HiddenInput(), max_length=128, label='') 
    id = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:200px;'}), label='id', required=False) 
    name_eng = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:200px;'}), label='eng') 
    name_de = forms.CharField(widget=forms.TextInput(attrs={'style': 'width:200px;'}), label='de') 
    gender = forms.CharField(widget=forms.CheckboxInput(), label='gender', required=False) 

    class Meta: 
     model = Name 
     fields = ('id', 'gender',) 

    def save(self): 
     instance = super(NameForm, self).save(commit=False) 
     obj_id = self.cleaned_data['id'] 
     if obj_id: 
      instance_bd = Name.objects.get(pk=obj_id) 
      loc = instance_bd.name 
      loc.de = self.cleaned_data['name_de'] 
      loc.eng = self.cleaned_data['name_eng'] 
      loc.save() 
      instance.id = obj_id 
     else: 
      loc = Localization(de=self.cleaned_data['name_de'], eng=self.cleaned_data['name_eng']) 
      loc.save() 
     instance.name = loc 
     instance.save() 
     return instance 

Der Blick einfach in diesem Fall besser, diese

if request.method == 'POST': 
    form = ItemForm(request.POST) 
    # check whether it's valid: 
    if form.is_valid(): 
     post = request.POST 
     set_name_eng= post['name_eng'] 
     set_name_de= post['name_de'] 
     set_on_sale = post['on_sale'] 

     #now here we create the anothers objects 
     a = Localization(de=set_name_de, eng=set_name_eng) 
     a.save() 

     b = Item(name=a, on_sale=sale) 
     b.save() 

ich den letzten Teil nicht verstehen, nicht ist es die forms'save Methode verwenden, versuchen

@login_required 
def admin_lists(request): 
    if request.method == 'POST': 
     form = NameForm(request.POST) 
     if form.is_valid(): 
      form.save() 
    forms = {'name': NameForm()} 
    return render(request, 'admin/lists.html', {'forms': forms}) 
+1

was Sie suchen, ist "commit = false" in der Formularüberprüfung in views.py. Schau mal hier https://stackoverflow.com/questions/12848605/django-modelform-what-is-savecommit-false-used-for. Poste deine views.py vielleicht kann ich dir zeigen was ich meine. – hansTheFranz

+0

@hansTheFranz danke. Ich habe es so funktionieren lassen, wie ich es wollte, Code oben. Wenn Verbesserungen möglich sind, lassen Sie es mich bitte wissen. –

Antwort

0

ist , aber ich denke, dass Sie besser Ihre Modelle und Formen organisieren müssen, lassen Sie mich wissen, und ich werde versuchen, Ihnen zu helfen

+0

Danke für den Kommentar. Warum ist diese Methode besser als das mit dem save() des Formulars? –

+0

In diesem Fall müssen Sie Daten von anderen Modellen und nicht nur von der Modellform ändern, aber zum Beispiel in großen Modellen ist same() sehr nützlich, auch können Sie beide Methoden mit .save (commit = False) mischen –

Verwandte Themen