6

Kullanıcılarımın bulunduğu bir sayfam var ve profillerini güncellemek için bir bağlantıya tıklayabilmek istiyorum. 'Güncelle' tıklandığında, tek bir sayfada, kullanıcı adı, ad, ... e-posta, telefon numarası, bölüm vb. Bunu, biri Kullanıcı için, diğeri ise ek bilgi olmak üzere iki form kullanarak gerçekleştirdim. ListView, DeleteView ve CreateView bu iki formla mükemmel çalışır, ancak UpdateView'ı değil. İki formu ilk verilerle başlatamıyorum.Django sınıf temelli görünümler - İki model formlu UpdateView - bir tane gönder

Sorun şu ki: iki formu nasıl verilerle eşleştirebilirim? Self.object dosyasının üzerine yazılsın mı? get_form_kwargs? En şık çözüm ne olurdu?

UpdateView sınıfı aşağıdadır. Bir 'kopyala-yapıştır' çözümü aramıyorum ama belki doğru yöne işaret et.

Teşekkürler.

Paul

telefon numarası, bölüm Çalışan adında bir model tanımlanmıştır.

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

şablon:

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

görünümü sınıftır:

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

cevap

4

varolan formun örneklemek için "örnek" kwarg kullanmak mümkün olmalıdır model, ihtiyacınız olan şey buysa. Örnek:

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

deneyin self.request.getget_content_data üzerinde formlar Kurucular çıkın ve "nesne" değişkeni kullanmak. Bu get ile kurucuyu daha çok this link içinde yeniden başlatırsınız.

Kodum:

context['form'] = self.form_class(instance=self.object) 
İlgili konular