Die Verwendung von zwei verschiedenen Django-Formular an die gleiche Vorlage?
Meine forms.py:
class AlertForm(forms.ModelForm):
class Meta:
model=Alert
fields = ('high','medium', 'user')
widgets = {
'user': forms.HiddenInput()
}
AlertCountFormset = modelformset_factory(Alert,
form = AlertForm)
Anderen Django Form-Klasse:
class NotifierForm(forms.ModelForm):
high = forms.ChoiceField(choices=NOTIFIER_TYPE)
medium = forms.ChoiceField(choices=NOTIFIER_TYPE)
low = forms.ChoiceField(choices=NOTIFIER_TYPE)
def save(self, commit=True):
alert = super(NotifierForm, self).save(commit=False)
alert.high = self.cleaned_data["high"]
alert.medium = self.cleaned_data["medium"]
alert.low = self.cleaned_data["low"]
alert.save()
return alert
class Meta:
model=Notifier
fields = ('high','medium', 'low', 'user')
widgets = {
'user': forms.HiddenInput()
}
NotifierFormset = modelformset_factory(Notifier,
form = NotifierForm)
Unten für die Auswahl Felder:
NOTIFIER_TYPE = (
(0, _('E-mail')),
(1, _('Skype')),
(2, _('IRC'))
)
Will ich füllen Sie diese beiden Formulare auf der gleichen Vorlage. So wähle ich zu schreiben, die gleichen Ansichten, für beide also :
def profile_setting(request, slug):
if request.method == 'POST':
alert_form = AlertForm(request.POST)
notifier_form = NotifierForm(request.POST)
if alert_form.is_valid() and notifier_form.is_valid():
alert = alert_form.save(commit=False)
notifier = notifier_form.save(commit=False)
alert.user = request.user.username
notifier.user = request.user.username
notifier.save()
alert.save()
return HttpResponseRedirect(reverse('profile_setting', args=[slug]))
extra_context = {
'alert_form': AlertForm(),
'notifier_form': NotifierForm()
}
return direct_to_template(request,'users/user_profile_setting.html',
extra_context)
Laut, dass in meinem template.html:
{% block content %}
<h3>{% trans "Alerts limit" %}</h3>
<form action="" method="POST">{% csrf_token %}
{{ alert_form.as_p }}
<input type="submit" value="{% trans 'Update' %}" />
</form>
<h3>{% trans "Notifier setting" %}</h3>
<form action="" method="POST">{% csrf_token %}
{{ notifier_form.as_p }}
<input type="submit" value="{% trans 'Update' %}" />
</form>
Alles ist richtig, Es ist das speichern der Daten in die Datenbank auch. Aber das problem ist, wenn ich gefüllt, die aler_form und klicken Sie auf die update-buttone. es das update auch die andere form mit dem gleichen Wert oder Umgekehrt. Zum Beispiel, wenn ich wählen
1 2 3 for high , medium and low for alert_Form
Dann sparen Sie auch den gleichen Wert für notify_form. Warum ist das passiert. Ist, dass etwas nicht stimmt mit den Ansichten?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie die
prefix
argument, so dass die Feldnamen nicht zur Deckung zu bringen.Beispiel:
Müssen Sie mit dem gleichen Präfix in Ihrem ungebundene Formulare.
Den Vorteil der Verwendung von Präfix ist, dass Sie nicht brauchen, um manuell die Felder umbenennen, wie umnik700 schlägt in Ihrer Antwort.
extra_context
), da Ihre form an die post-Daten.Das problem ist, dass in den Formularen die Felder haben den gleichen Namen.
Anfrage.POST ist ein dictionary-ähnliches Objekt. So enthält Sie nur die name/Wert-Paare aus der Anfrage. Wenn die Feldnamen gleich sind auf die beiden Formen dann, wenn Sie anrufen
diese initialisiert werden mit den gleichen Werten. Zum beheben dieses machen Sie den Namen eindeutig sein, zwischen zwei Formen. Zum Beispiel das Präfix alle Feldnamen auf die AlertForm mit "alert_".