2012-12-06 17 views
8

Tôi thực sự đang tìm kiếm các biểu mẫu django khó hiểu.nhầm lẫn các biểu thức django (xác thực, bắt buộc, empty_permitted)

Tôi đặc biệt là gặp vấn đề với các khái niệm sau đây mà tôi không thực sự hiểu:

Các formset là đủ thông minh để bỏ qua các hình thức bổ sung mà không được thay đổi.

Nói về mã cố gắng quá thông minh. Điều này nghĩa là gì? Tại sao tôi thậm chí muốn điều đó?

Sau đó, cố gắng để hiểu được những khái niệm trước đây, tôi thấy người

làm hình thức trong formsets yêu cầu.

Đây là một khái niệm khác mà tôi không thể bị treo. Mẫu đơn yêu cầu trong một formset là gì và tại sao tôi phải làm một mẫu đơn yêu cầu? Một lần nữa một cái gì đó không được ghi lại.

Sau đó, đến vấn đề thực tế của tôi, mà người khác dường như đã có, nhưng họ không thể giải thích lý do tại sao họ đã cố định nó theo cách họ đã cố định nó.

Tại sao trong ví dụ sau, biểu mẫu hợp lệ, trong khi biểu mẫu riêng lẻ có cùng một đầu vào sẽ không hợp lệ?

import django 
class MyForm(django.forms.Form): 
    start = django.forms.DateField() 
    end = django.forms.DateField() 

data = { 
    'form-TOTAL_FORMS': '1', 
    'form-MAX_NUM_FORMS': '', 
    'form-INITIAL_FORMS': '0', 
    'form-0-start': '', 
    'form-0-end': '', 
} 

MyFormSet = formset_factory(MyForm) 
formset = MyFormSet(data) 
#fee_forms[0].empty_permitted = False 

print formset.is_valid() 
# --- returns True --- 
print formset.errors 

f = MyForm({'start': '', 'end': ''}) 
print f.is_valid() 
# --- returns False --- 
print f.errors 

Đặt empty_permitted to False dường như cung cấp kết quả mong đợi cho tôi (cho biểu mẫu không hợp lệ do thiếu 'bắt đầu' và 'kết thúc'). Đây là một tính năng không có giấy tờ khác ...

Có ai dành chút thời gian để giải thích không?

Cảm ơn bạn

Trả lời

12

Các formset là đủ thông minh để bỏ qua các hình thức bổ sung mà không được thay đổi.

Nói về mã cố gắng quá thông minh. Điều này nghĩa là gì? Tại sao tôi thậm chí muốn điều đó?

Nó dường như có nghĩa - như bạn làm việc ra - đó là hình thức "thêm" được tạo ra bởi formset (với extra=N trong ví dụ của bạn) có empty_permitted thiết lập để True. Have a glance at django/forms/formsets.py để xem điều này xảy ra.

formset[0].empty_permitted có nghĩa là nếu formset[0].has_changed() == False, không cần xử lý/xác thực thêm. Một lần nữa, you can see this in action in forms/forms.py.

Để ngăn chặn này, a blog post suggests xác định một formset tùy chỉnh để sử dụng trong modelformset_factory (hoặc inlineformset_factory) mà đặt empty_permitted = False:

class MyModelFormSet(BaseModelFormSet): 
    def __init__(self, *args, **kwargs): 
     super(MyModelFormSet, self).__init__(*args, **kwargs) 
     for form in self.forms: 
      form.empty_permitted = False 

tôi đã không kiểm tra này, nhưng có vẻ hợp pháp.

Là tại sao bất cứ ai có thể muốn điều này, nó làm cho sử dụng django-dynamic-formset đơn giản hơn nhiều - bạn có thể gửi dữ liệu cho form-0form-2 và, giả sử form-1 được một hình thức thêm (tức không liên quan đến mô hình dữ liệu), Django chiến thắng' t phàn nàn. Nếu empty_permittedFalse theo mặc định, bạn sẽ phải lo lắng về việc bỏ qua biểu mẫu trống trong mã của riêng bạn hoặc liên kết lại mọi thứ trong Javascript.