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.
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