6

Tôi có một trang có danh sách người dùng và muốn có thể nhấp vào liên kết để cập nhật tiểu sử của họ. Khi 'cập nhật' được nhấp, tôi sẽ có thể chỉnh sửa tên người dùng, tên, ... email, số điện thoại, bộ phận vv, trong một trang duy nhất, bằng cách sử dụng một nút gửi đơn. Tôi đã thực hiện điều này bằng cách sử dụng hai biểu mẫu, một cho Người dùng và một cho thông tin bổ sung. ListView, DeleteView và CreateView hoạt động hoàn hảo với hai dạng này, chứ không phải là UpdateView. Tôi không thể khởi tạo hai biểu mẫu với dữ liệu ban đầu.Chế độ xem dựa trên lớp Django - UpdateView với hai mẫu biểu mẫu - một gửi

Câu hỏi đặt ra là: làm cách nào để tạo nhanh hai biểu mẫu với dữ liệu? Ghi đè self.object? get_form_kwargs? Điều gì sẽ là giải pháp thanh lịch nhất?

Lớp UpdateView bên dưới. Tôi không tìm kiếm một giải pháp 'copy-paste', nhưng có thể hướng tôi đi đúng hướng.

Cảm ơn.

Paul

Số điện thoại, bộ phận được xác định trong mô hình có tên Nhân viên.

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

Mẫu là:

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

Lớp xem là:

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

Trả lời

4

Bạn sẽ có thể sử dụng "dụ" kwarg cho instantiation của các hình thức từ một hiện mô hình nếu đó là những gì bạn cần. Ví dụ:

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

Cố gắng bỏ self.request.get trên get_content_data hình thức constructor và sử dụng "đối tượng" biến. Với số get bạn khởi tạo lại hàm tạo, nhiều hơn trong this link.

Mã của tôi:

context['form'] = self.form_class(instance=self.object) 
Các vấn đề liên quan