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')