Django-Klassen-basierte Ansichten - UpdateView mit zwei Modellformen - eine Übergabe

Ich habe eine Seite mit einer Liste von Benutzern und möchte in der Lage sein, auf einen Link zu klicken, um deren Profil zu aktualisieren. Wenn auf "Aktualisieren" geklickt wird, sollte es mir möglich sein, den Benutzernamen, den Vornamen, die E-Mail-Adresse, die Telefonnummer, die Abteilung usw. auf einer einzigen Seite mit einem einzigen Senden-Button zu bearbeiten. Dazu habe ich zwei Formulare verwendet, eines für Benutzer und eines für die zusätzlichen Informationen. ListView, DeleteView und CreateView funktionieren perfekt mit diesen beiden Formularen, nicht jedoch mit UpdateView. Ich kann die beiden Formulare nicht mit Anfangsdaten instanziieren.

Die Frage ist: Wie instanziiere ich die beiden Formulare mit Daten? Self.object überschreiben? get_form_kwargs? Was wäre die eleganteste Lösung?

Die UpdateView-Klasse ist unten. Ich bin nicht auf der Suche nach einer Lösung zum Kopieren und Einfügen, sondern weise mich vielleicht in die richtige Richtung.

Vielen Dank.

Paul

Die Telefonnummer, Abteilung ist in einem Modell mit dem Namen Employee 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')

Antworten auf die Frage(2)

Ihre Antwort auf die Frage