5

Mein forms.py:Wie verwendet man zwei verschiedene Django-Form bei der gleichen Vorlage?

class AlertForm(forms.ModelForm): 
class Meta: 
    model=Alert 
    fields = ('high','medium', 'user') 
    widgets = { 
     'user': forms.HiddenInput() 
    } 

AlertCountFormset = modelformset_factory(Alert, 
             form = AlertForm) 

Eine andere Klasse Django Form:

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 ist für die Auswahlfelder:

NOTIFIER_TYPE = (
(0, _('E-mail')), 
(1, _('Skype')), 
(2, _('IRC')) 
) 

ich diese beiden Formen auf dem gleichen füllen wollen Vorlage. So wähle ich gleiche Ansichten schreiben sowohl das heißt:

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) 

Nach 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 richtig ist, ist es die Daten in der Datenbank Speicher auch. Aber das Problem ist, wann immer ich das aler_form füllte und auf den update buttone klickte. es aktualisiert auch die andere Form mit dem gleichen Wert oder umgekehrt. Zum Beispiel, wenn ich wähle

1 2 3 for high , medium and low for alert_Form 

Dann speichern Sie auch den gleichen Wert für notify_form. Warum passiert dies. Stimmt das nicht mit den Ansichten?

Antwort

12

Verwenden Sie das Argument prefix, damit Ihre Feldnamen nicht übereinstimmen.

Zum Beispiel:

alert form = AlertForm(request.POST, prefix='alert') 
notifier_form = NotifierForm(request.POST, prefix='notifier') 

Sie müssen den gleichen Präfix in Ihren ungebundenen Formen verwenden.

extra_context = { 'alert_form': AlertForm(prefix='alert'), notifier_form': NotifierForm(prefix='notifier') } 

Der Vorteil Präfix ist, dass Sie die Felder nicht manuell umbenennen müssen, wie umnik700 in ihrer Antwort vermuten lässt.

+0

Abgesehen davon ändert sich. sollte ich Änderungen an der Template-Seite vornehmen oder nicht? –

+0

Nein, Sie müssen keine Änderungen an der Vorlage vornehmen. – Alasdair

+0

Nach dem Hinzufügen. Nichts passiert. Ich meine, kein Wert wird in die Datenbank eingegeben. Auch wenn es keinen Fehler gibt –

3

Das Problem ist, dass auf Ihren Formularen die Felder die gleichen Namen haben.

request.POST ist ein wörterbuchähnliches Objekt. Es enthält also nur die Name/Wert-Paare aus der Anfrage. Wenn die Feldnamen das gleiche auf beiden Formen sind dann, wenn Sie

rufen
alert_form = AlertForm(request.POST) 
notifier_form = NotifierForm(request.POST) 

sie sind mit den gleichen Werten initialisiert. Um dies zu beheben, müssen die Namen zwischen Ihren beiden Formularen eindeutig sein. Geben Sie zum Beispiel allen Feldnamen im AlertForm "alert_" voran.

+0

Sorry ich habe dich nicht bekommen. Welche zwei Namen? –

+0

Danke für die Antwort :) Eine weitere Sache. Ist dies in Django-Form möglich, wann immer ich meine Felder in den Formularen aktualisiere? Alle Felder sollten den zuvor gespeicherten Wert in der Datenbank anzeigen. –

+1

Ja, es ist möglich. Der extra_context, der zwei Formularinstanzen enthält. So wie du es jetzt machst, übergibst du nicht initialisierte Formen. Wenn Sie die Daten anzeigen möchten, müssen Sie sie initialisieren. –

Verwandte Themen