2016-05-18 6 views
3

Ich denke, was ich versuche zu erreichen, ist nicht schwer, aber ich habe keine Ahnung, wie es geht hehehehe!Django - Erstellen Sie ein neues Objekt in Form, aktualisieren Sie die Auswahlbox und speichern Sie es

Grundsätzlich, was ich brauche ist die Funktion, die wir in Django Admin haben, wenn Sie ein neues Objekt erstellen, wenn Sie einen Fremdschlüssel haben, können Sie neue Daten hinzufügen (ein Popup öffnen), speichern und dann Das Auswahlfeld wird automatisch aktualisiert.

Was ich habe, ist diese Form:

enter image description here

Ich weiß, dass einfach sein würde, es mit etwas Javascript zu tun, aber mein Punkt ist, Django einige Regeln, und so weit ich weiß, ich kann einem bereits erstellten Formular keine neuen Daten hinzufügen, oder? Andernfalls wird Django dieses Formular nicht validieren. Wie könnte ich das erreichen?

PS: "Local" ist das Auswahlfeld, in dem ich neue Daten hinzufügen möchte. Der Benutzer sollte in der Lage sein, auf dieser Seite ein neues Local zu erstellen, anstatt zu einer anderen Seite zu wechseln. Danke :)

+0

Bitte werfen Sie einen Blick auf http://stackoverflow.com/questions/7782479/django-reverse-engineering-the-admin-sites-add-foreign-key-button es könnte Ihnen helfen. –

Antwort

0

Nichts falsch mit der Aktualisierung des Wertes mit Javascript, solange der Schlüssel in Ihrem neuen Kombinationsfeld hat den richtigen Schlüssel in der Datenbank, dann sollte es in Ordnung sein.

Rufen Sie diese Funktion auf, nachdem Sie den letzten Eintrag gespeichert haben.

function refreshLocal(){ 
    $.get(window.location.href, '', function(html){ 
     // change the id to the local combox's id 
     var serverLocalDropBox = $(html).find('#id_local'); 
     if (serverLocalDropBox.length){ 
      $('#id_local').replaceWith(serverLocalDropBox); 
     } 
    }) 
} 

Wenn Sie keine JavaScript-Lösung verwenden möchten, können Sie das Formular mit Refresh-Flag und auf der Server-Seite posten, wenn Sie sehen, dass Flag einfach nicht die Form nicht bestätigen und zurück gibt. Da Sie einen neuen Eintrag im Fremdschlüssel haben, wird das Suchfeld automatisch aktualisiert, um den neuen Eintrag aufzunehmen.

function serverRefreshLocal(){ 
     var $form = $('#your_form_id'); 
     $form.append('<input type="hidden" name="refresh" value="true" />'); 

     // you can use ajax submit and ajax refresh here if you don't want to leave the page 
     $form.submit(); 
    } 

// Server Side

def your_form_post_view(request): 

    if request.POST.get('refresh', 'false') == 'true': 
     # initial is the trick to save user input 
     your_form = YourForm(initial=request.POST) 
     context = { 
      'form': your_form, 
     } 
     return render(request, 'your_template.html', context) 

    # your view code goes here 
1

hier Ihre Frage:

ich keine neuen Daten in ein Formular können bereits erstellt, nicht wahr? Andernfalls wird Django dieses Formular nicht validieren. Wie könnte ich das erreichen?

Dann die Antwort:

Sie richtig sind, wird django Form Wert Werte übereinstimmen Regeln überprüfen. Aber:

erkennen, dass Ihr Hauptformular zweimal aufgerufen wird: auf GET und auf POST. Zwischen den beiden Formularausführungen nehmen Sie Änderungen an den Datenbankwerten vor, und zwar über Ihr neues Formular. Das bedeutet, dass in der zweiten Hauptformular Aufruf zur Datenbank der Wertschöpfung steht zur Verfügung:

field1 = forms.ModelChoiceField(queryset= ***1***) 

***1***: auf dem zweiten Aufruf neuer Wert bereits vorhanden ist field1.

Dann, sollten Sie keine Angst vor diesem Thema haben, wird der neue Wert auf Formular auf Ihrem Hauptformular POST-Anfrage verfügbar sein.