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})
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
@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. –