2017-12-09 6 views
1

Ich arbeite an einer einfachen Kostenüberwachungs-App. Unten sehen Sie die Ansicht mit allen Operationen des Benutzers finden können (Kosten oder Erträge):Mehrere Django-Formulare in modalen Fenstern für eine einzelne Ansicht

enter image description here

Basierend auf this thread I Bootstrap-modale Fenster neue Betriebsform angezeigt werden umgesetzt:

enter image description here

Unten kann ManageOperations Ansicht finden, die für das Darstellen der Ansichten verantwortlich ist, die oben dargestellt werden:

class ManageOperations(ListView, FormView, OperationMixIn): 

    model = Operation 
    form_class = OperationForm 
    template_name = "expenses/manage_operations.html" 
    success_url = reverse_lazy('manage_operations') 

    def get_context_data(self, **kwargs): 
     context = super(ManageOperations, self).get_context_data(**kwargs) 
     context['operations_list'] = Operation.objects.filter(user=self.request.user).order_by('-date') 
     return context 

    def get_form_kwargs(self): 
     kwargs = super(ManageOperations, self).get_form_kwargs() 
     kwargs.update(user=self.request.user, 
         initial={'account': Account.objects.get(user=self.request.user, default=True)}) 
     return kwargs 

    def form_valid(self, form): 
     operation = form.save(commit=False) 
     operation.currency = Account.objects.get(pk=form.instance.account_id).currency 
     self.update_account_balance(form) 
     form.instance.user = self.request.user 
     form.save() 
     return super(ManageOperations, self).form_valid(form) 

Ich möchte die gleichen modalen Fenster sowohl für "bearbeiten" und "löschen" Aktionen implementieren. Ich gehe davon aus, dass es durchaus für OperationDelete Ansicht einfach sein wird:

class OperationDelete(DeleteView, OperationMixIn): 

    model = Operation 
    success_url = reverse_lazy('manage_operations') 

    def delete(self, *args, **kwargs): 
     self.restore_account_balance(self.get_object().pk) 
     return super(OperationDelete, self).delete(*args, **kwargs) 

ich nur delete Methode, um meine ManageOperations Ansicht bewegen konnte und machen es aus DeleteView erben.

Die Dinge werden komplizierter, wenn es um die Bearbeitung bestehender Operationen geht. Derzeit Code finden Sie verantwortlich für eine Aktualisierung des bestehenden Eintrags Gabe:

class OperationUpdate(UpdateView, OperationMixIn): 

    model = Operation 
    form_class = OperationForm 
    success_url = reverse_lazy('manage_operations') 

    def get_form_kwargs(self): 
     kwargs = super(OperationUpdate, self).get_form_kwargs() 
     kwargs.update({'user': self.request.user}) 
     return kwargs 

    def form_valid(self, form): 
     self.restore_account_balance(self.get_object().pk) 
     self.update_account_balance(form) 
     form.instance.user = self.request.user 
     return super(OperationUpdate, self).form_valid(form) 

Wenn ich müde, um es in ManageOperations Ansicht zusammenführen würde ich mit mehrere Implementierung von get_form_kwargs und form_valid Methoden beschäftigen.

Könnten Sie mir bitte sagen, ob ich mit dieser Methode in die richtige Richtung gehe oder ob es einen besseren und eleganteren Weg gibt, mein Problem zu lösen? Einen großen ManageOperations View zu erstellen, der für alle Operations releated Aktionen verantwortlich sein würde, scheint mir ein bisschen albern zu sein.

+1

ich Zeit habe ich vor, dieses Problem mit modalform musste. Warum nicht Funktion verwenden, Funktion ist viel besser, wenn die Dinge kompliziert werden. Sie können auch ein einzelnes Modell in der Datei '.html' ohne Formulare erstellen und mit ajax die gewünschte Funktion aufrufen.Das Problem beim Rendern dieser Modellformen besteht darin, dass ein Modal für jedes Element in der Ansicht gerendert werden kann –

Antwort

0

Ich glaube, Ihr Ansatz ist in Ordnung, außer würde ich die UpdateView und DeleteView AJAX-Ansichten stattdessen: Lassen Sie sie JSON anstelle einer HTML-Vorlage und rufen Sie sie mit AJAX aus Ihrer Vorlage.

  • ManageOperations halten als
  • In Ihrem bearbeiten modale Form ist, lassen Sie AJAX die Formulardaten verwenden Sie es im Hinblick auf Ihre OperationUpdate zu posten.
  • Ändern Sie Ihre OperationUpdate Ansicht, um eine JSON-Antwort zurückzugeben. Sie könnten den ganzen Weg gehen und Django REST Framework dafür verwenden, aber es ist ziemlich einfach, bestehende Django generische CBVs anzupassen, um JSON zurückzugeben: Override render_to_response() (für den Fall, dass das Formular nicht gültig ist) und form_valid() Methoden. Sie geben nur die gebundenen Formularfelder (Werte) und die Fehler in Ihrem JSON zurück. Wenn das Formular gültig ist, geben Sie das gespeicherte Objekt in Ihrem JSON zurück, damit das JavaScript die entsprechenden Werte in der Tabelle aktualisieren kann.
  • Ändern Sie Ihre OperationDelete Ansicht, um auch eine JSON-Antwort zurückzugeben.
  • hinzufügen Verarbeitung der JSON Antworten in Ihrem Javascript, Formfehler angezeigt werden, schließen Sie die modal, die Werte in der Tabelle aktualisieren, etc ...
Verwandte Themen