6

Mam stronę z listą użytkowników i chciałbym móc kliknąć łącze, aby zaktualizować swój profil. Po kliknięciu przycisku "Aktualizuj" powinienem mieć możliwość edytowania nazwy użytkownika, imienia, ... adresu e-mail, numeru telefonu, działu itp. Na jednej stronie za pomocą jednego przycisku przesyłania. Osiągnąłem to, używając dwóch formularzy, jednego dla użytkownika i jednego dla dodatkowych informacji. ListView, DeleteView i CreateView działają doskonale z tymi dwoma formularzami, ale nie z UpdateView. Nie jestem w stanie utworzyć dwóch formularzy z danymi początkowymi.Widoki oparte na klasach Django - UpdateView z dwoma modelami formularzy - jeden przesłać

Pytanie brzmi: jak utworzyć dwa formularze z danymi? Zastąpić self.object? get_form_kwargs? Jakie byłoby najbardziej eleganckie rozwiązanie?

Klasa UpdateView znajduje się poniżej. Nie szukam rozwiązania "kopiuj-wklej", ale może wskaż mi właściwy kierunek.

Dzięki.

Paul

numer telefonu, wydział jest zdefiniowany w modelu o nazwie pracownika.

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

Szablon jest:

{% 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 %} 

Klasa widok jest:

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

Odpowiedz

4

powinny mieć możliwość korzystania z „instancji” kwarg do konkretyzacji formularza z istniejącego model, jeśli tego właśnie potrzebujesz. Przykład:

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

Spróbuj rzucić się self.request.get na get_content_data formy konstruktorów i użyć zmiennej „obiekt”. Dzięki temu get ponownie zainicjujesz konstruktora, więcej w this link.

Mój kod:

context['form'] = self.form_class(instance=self.object) 
Powiązane problemy