2011-09-09 30 views
10

Tôi có một trang hiển thị nhiều Biểu mẫu, mỗi trang có một tiền tố. Các biểu mẫu được tạo bằng cách sử dụng formset_factory các tùy chọn mặc định, bao gồm extra=1. Hàng có thể được thêm hoặc xóa bằng JavaScript.Django formset - chỉ hiển thị các trường bổ sung khi không có tập dữ liệu ban đầu?

Nếu người dùng đang thêm dữ liệu mới, một hàng trống sẽ hiển thị. Hoàn hảo.

Nếu người dùng đã thêm dữ liệu nhưng xác thực biểu mẫu không thành công, trong trường hợp đó tập hợp được điền dữ liệu POST bằng cách sử dụng MyFormset(data, prefix='o1-formsetname') v.v., chỉ dữ liệu mà chúng đã nhập mới hiển thị. Một lần nữa, hoàn hảo. (o1 vv được tạo động, mỗi o tương ứng với "tùy chọn" và mỗi "tùy chọn" có thể có nhiều bộ định dạng).

Tuy nhiên, nếu người dùng đang chỉnh sửa dữ liệu hiện có, trong trường hợp đó, khung nhìn sẽ điền vào biểu mẫu bằng cách sử dụng MyFormset(initial=somedata, prefix='o1-formsetname') trong đó somedata là danh sách các dữ liệu đến từ mô hình trong cơ sở dữ liệu. . Tôi không muốn một hàng trống xuất hiện trừ khi người dùng thêm một cách rõ ràng bằng cách sử dụng JavaScript.

Có cách nào đơn giản để ngăn chặn formset hiển thị thêm hàng nếu dữ liệu ban đầu được đặt không? Lý do tôi sử dụng initial trong ví dụ thứ ba là nếu tôi vừa chuyển dữ liệu bằng cách sử dụng MyFormset(somedata, prefix='o1-formsetname') Tôi phải thực hiện thêm một bước để định dạng lại tất cả dữ liệu thành dict kiểu POSTdata bao gồm tiền tố cho mỗi trường, ví dụ o1-formsetname-1-price: x v.v., cũng như tính toán dữ liệu biểu mẫu quản lý, bổ sung toàn bộ tải của biến chứng.

Một giải pháp có thể là chặn bộ định dạng trước khi được gửi tới mẫu và xóa hàng theo cách thủ công, nhưng thuộc tính extra_forms dường như không thể ghi và đặt extra thành 0 không tạo ra bất kỳ sự khác biệt nào. Tôi cũng có thể có JavaScript phát hiện trường hợp này và xóa hàng. Tuy nhiên tôi không thể không nghĩ rằng tôi đang thiếu một cái gì đó hiển nhiên vì hành vi tôi muốn là những gì có vẻ là hành vi mong đợi hợp lý với tôi.

Cảm ơn.

+0

Tôi đang sử dụng Django 1.1, trong đó thông số 'max_num' hoạt động khác nhau; xem câu trả lời dưới đây. – garybryan

Trả lời

3

Tôi đã đưa ra giải pháp hoạt động với Django 1.1. Tôi đã tạo một lớp con của BaseFormSet ghi đè phương thức total_form_count sao cho, nếu các biểu mẫu ban đầu tồn tại, tổng số không bao gồm các biểu mẫu bổ sung. Bit của một hack có lẽ, và có lẽ có một giải pháp tốt hơn mà tôi không thể tìm thấy, nhưng nó hoạt động.

class SensibleFormset(BaseFormSet): 
    def total_form_count(self): 
     """Returns the total number of forms in this FormSet.""" 
     if self.data or self.files: 
      return self.management_form.cleaned_data[TOTAL_FORM_COUNT] 
     else: 
      if self.initial_form_count() > 0: 
       total_forms = self.initial_form_count() 
      else: 
       total_forms = self.initial_form_count() + self.extra 
      if total_forms > self.max_num > 0: 
       total_forms = self.max_num 
      return total_forms 
+0

Tôi tự làm 'myFormset.extra = 1' trong' CreateView' và đặt giá trị bên trong 'constructor inlineformset_factory' thành 0. Hãy nghĩ rằng ít mã hơn (một dòng). –

5

Sử dụng đối số max_num từ khóa để formset_factory:

MyFormset = formset_factory([...], extra=1, max_num=1) 

Để biết thêm chi tiết, hãy kiểm tra limiting the maximum number of forms.

Một sự cố: có thể bạn muốn có thể quá trình nhiều hơn một biểu mẫu trống. Đây không phải là quá khó; chỉ cần đảm bảo rằng bạn không sử dụng đối số từ khóa max_num ở phía xử lý POST.

+0

Thực ra tôi đã xem lại vấn đề này ngày hôm nay. Giải pháp này không hoạt động như mong đợi: nếu có một số hàng đầu tiên, chỉ một trong các hàng này được hiển thị, vì max_num giới hạn chúng. Tôi nghĩ điều này là vì tôi đang ở trên Django 1.1; 1.1 tài liệu nói "Tham số max_num cho formset_factory cung cấp cho bạn khả năng buộc số lượng biểu mẫu tối đa mà biểu mẫu sẽ hiển thị" trong khi tài liệu 1.3 nói "Tham số max_num cho formset_factory cho bạn khả năng giới hạn số lượng biểu mẫu trống tối đa sẽ hiển thị ", do đó, ý nghĩa của' max_num' đã thay đổi. Bất kỳ ý tưởng cho 1,1? – garybryan

+0

Chỉ cần những gì cần thiết để giới hạn số lượng biểu mẫu cho một! đơn giản và sạch sẽ ... trả lời tốt nhất! – AmiNadimi

Các vấn đề liên quan