6

मेरे पास उपयोगकर्ताओं की एक सूची वाला एक पृष्ठ है, और वे अपनी प्रोफ़ाइल को अपडेट करने के लिए एक लिंक पर क्लिक करने में सक्षम होना चाहते हैं। जब 'अपडेट' पर क्लिक किया जाता है, तो मुझे एकल सबमिट बटन का उपयोग करके, एक ही पृष्ठ में उपयोगकर्ता नाम, पहला नाम, ... ईमेल, फोन नंबर, विभाग इत्यादि को संपादित करने में सक्षम होना चाहिए। मैंने इसे दो रूपों का उपयोग करके, उपयोगकर्ता के लिए एक और अतिरिक्त जानकारी के लिए पूरा किया। ListView, DeleteView और CreateView इन दो रूपों के साथ पूरी तरह से काम करते हैं, लेकिन UpdateView नहीं। मैं प्रारंभिक डेटा के साथ दो रूपों को तुरंत चालू करने में सक्षम नहीं हूं।Django क्लास आधारित विचार - दो मॉडल रूपों के साथ अद्यतन दृश्य - एक सबमिट

सवाल यह है कि मैं डेटा के साथ दो रूपों को कैसे चालू करूं? Self.object ओवरराइट करें? get_form_kwargs? सबसे सुरुचिपूर्ण समाधान क्या होगा?

अद्यतन दृश्य वर्ग नीचे है। मैं 'कॉपी-पेस्ट' समाधान की तलाश नहीं कर रहा हूं, लेकिन शायद मुझे सही दिशा में इंगित करें।

धन्यवाद।

पॉल

फोन नंबर, विभाग कर्मचारी नाम के एक मॉडल में परिभाषित किया गया है।

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

टेम्पलेट है:

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

दृश्य वर्ग है:

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

उत्तर

4

आप एक मौजूदा से फार्म की इन्स्टेन्शियशन के लिए "उदाहरण" kwarg उपयोग करने के लिए सक्षम होना चाहिए मॉडल अगर आपको यही चाहिए। उदाहरण:

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

कोशिश self.request.getget_content_data पर रूपों कंस्ट्रक्टर्स छोड़ दी और "वस्तु" चर का उपयोग करें। get के साथ आप this link में कन्स्ट्रक्टर को फिर से शुरू करते हैं।

मेरे कोड:

context['form'] = self.form_class(instance=self.object) 
संबंधित मुद्दे