6

Ich habe eine Seite mit einer Liste von Benutzern, und wäre in der Lage, auf einen Link klicken, um ihr Profil zu aktualisieren. Wenn "update" angeklickt wird, sollte ich in der Lage sein, den Benutzernamen, den Vornamen, ... E-Mail, Telefonnummer, Abteilung usw. auf einer einzigen Seite zu bearbeiten, mit einem einzigen Absenden-Button. Ich habe dies erreicht, indem ich zwei Formulare verwendet habe, eines für den Benutzer und eines für die zusätzlichen Informationen. Die ListView, DeleteView und CreateView funktionieren perfekt mit diesen beiden Formen, aber nicht mit der UpdateView. Ich bin nicht in der Lage, die zwei Formulare mit Anfangsdaten zu instanziieren.Django klassenbasierte Ansichten - UpdateView mit zwei Modellformularen - ein Submit

Die Frage ist: Wie instanziiere ich die zwei Formulare mit Daten? Eigenes Objekt überschreiben? get_form_kwargs? Was wäre die eleganteste Lösung?

Die UpdateView-Klasse ist unten. Ich suche nicht nach einer Kopier-Paste-Lösung, sondern vielleicht in die richtige Richtung.

Danke.

Paul

Die Telefonnummer, Abteilung wird in einem Modell mit dem Namen Mitarbeiter definiert.

class Employee(models.Model): 
    user = models.OneToOneField(User) 
    phone_number = models.CharField(max_length=13, null=True) 
    department = models.CharField(max_length=100) 

Die Vorlage ist:

{% extends "baseadmin.html" %} 
{% load crispy_forms_tags %} 

{% block content %} 
<h4>Edit a user</h4> 
<form action="" method="post" class="form-horizontal"> 
    <legend>Edit a user</legend> 
    {% crispy form %} 
    {% crispy form2 %} 
    <div class="form-actions"> 
     <input type="submit" class="btn btn-primary" value="Save"> 
      <a href="{% url 'client_list' %}" class="btn">Cancel</a> 
    </div> 
</form> 
{% endblock content %} 

Die Ansichtsklasse ist:

class ClientUpdateView(UpdateView): 
    model = User 
    form_class = ClientsUserForm 
    second_form_class = ClientsForm 
    template_name = 'admin/client_update.html' 

    def get_context_data(self, **kwargs): 
     context = super(ClientUpdateView, self).get_context_data(**kwargs) 
     context['active_client'] = True 
     if 'form' not in context: 
      context['form'] = self.form_class(self.request.GET) 
     if 'form2' not in context: 
      context['form2'] = self.second_form_class(self.request.GET) 
     context['active_client'] = True 
     return context 

    def get(self, request, *args, **kwargs): 
     super(ClientUpdateView, self).get(request, *args, **kwargs) 
     form = self.form_class 
     form2 = self.second_form_class 
     return self.render_to_response(self.get_context_data(
      object=self.object, form=form, form2=form2)) 

    def post(self, request, *args, **kwargs): 
     self.object = self.get_object() 
     form = self.form_class(request.POST) 
     form2 = self.second_form_class(request.POST) 

     if form.is_valid() and form2.is_valid(): 
      userdata = form.save(commit=False) 
      # used to set the password, but no longer necesarry 
      userdata.save() 
      employeedata = form2.save(commit=False) 
      employeedata.user = userdata 
      employeedata.save() 
      messages.success(self.request, 'Settings saved successfully') 
      return HttpResponseRedirect(self.get_success_url()) 
     else: 
      return self.render_to_response(
       self.get_context_data(form=form, form2=form2)) 

    def get_success_url(self): 
     return reverse('client_list') 

Antwort

4

Sie sollten die „Instanz“ kwarg für die Instanziierung des Formulars aus einer bestehenden nutzen können Modell, wenn es das ist, was du brauchst. Beispiel:

context['form'] = self.form_class(self.request.GET, instance=request.user) 
0

Versuch zu beenden, den self.request.get auf get_content_data Formen Konstrukteuren und verwenden Sie das "Objekt" Variable. Mit diesem get reinitialisieren Sie den Konstruktor, mehr in this link.

Mein Code:

context['form'] = self.form_class(instance=self.object) 
Verwandte Themen