Chèn lỗi vào biểu mẫu đã được xác thực?


97

Sau khi form.Formxác thực các giá trị đầu vào của người dùng, tôi chuyển chúng sang một quy trình riêng biệt (bên ngoài) để xử lý thêm. Quá trình bên ngoài này có thể tìm thấy thêm lỗi trong các giá trị.

Có cách nào để đưa những lỗi này vào biểu mẫu đã được xác thực để chúng có thể được hiển thị thông qua các phương pháp hiển thị lỗi biểu mẫu thông thường (hoặc có những cách tiếp cận thay thế tốt hơn) không?

Một gợi ý là bao gồm xử lý bên ngoài trong xác thực biểu mẫu, điều này không lý tưởng vì quá trình bên ngoài thực hiện nhiều hơn là chỉ xác nhận đơn thuần.

Câu trả lời:


92

Form._errorscó thể được coi như một từ điển tiêu chuẩn. Đây được coi là một hình thức tốt để sử dụng ErrorListlớp và thêm lỗi vào danh sách hiện có:

from django.forms.utils import ErrorList
errors = form._errors.setdefault("myfield", ErrorList())
errors.append(u"My error here")

Và nếu bạn muốn thêm lỗi không phải trường, hãy sử dụng django.forms.forms.NON_FIELD_ERRORS(mặc định thành "__all__") thay vì "myfield".


2
Điều này có vẻ hơi khó chịu, vì tên "_errors" cho thấy nó phải là nội bộ của lớp biểu mẫu. Đó có phải là cách tiêu chuẩn để làm điều này trong Django không? Tôi đang ở trong một tình huống tương tự với OP: Tôi có một biểu mẫu mà người dùng cung cấp một tên mới phải là duy nhất trong cơ sở dữ liệu. Nếu có va chạm, tôi muốn gửi lại biểu mẫu với lỗi trên đó, nhưng tôi sẽ không biết cho đến khi tôi thực sự cố gắng thực hiện chèn cơ sở dữ liệu. (Về lý thuyết, trình xác thực có thể kiểm tra cơ sở dữ liệu, nhưng điều đó có mùi và dễ bị chủng tộc.)
Weeble

1
@scompt: cảm ơn, đã sửa. @Weeble: _errorslà một phần của API biểu mẫu công khai, mặc dù tên của nó; xem câu trả lời của insin cho liên kết tài liệu.
John Millikin

18
Điều này cực kỳ không phải là trăn. Khó như thế nào để triển khai form.errors ['myfield']. Append (my_error) hoặc form.add_error ('myfield', my_error)? Có nhiều chỗ cho lỗi (không có ý định chơi chữ) trong quá trình triển khai hiện tại.
Michael

2
Chủ yếu là đầy đủ. Một lưu ý thêm là nếu is_valid () đã không được gọi, sau đó bạn sẽ cần phải thiết lập form._errors = ErrorDict ()
jacob

12
@ Michael - trông giống như họ đã tư vấn cho bạn ... Django Dev - Form.add_error (lĩnh vực, lỗi)
Clayton


14

Bạn có thể thêm chi tiết lỗi bổ sung vào _errorsthuộc tính của biểu mẫu trực tiếp:

https://docs.djangoproject.com/en/1.5/ref/forms/validation/#describe-later https://docs.djangoproject.com/en/1.6/ref/forms/validation/#modizing-field-errors


6
Và dường như trong phiên bản phát triển đăng 1.6, họ đang thêm một add_errorchức năng: docs.djangoproject.com/en/dev/ref/forms/api/…
brianmearns

Và bây giờ Django 1.7 có một chức năng add_error chính thức: docs.djangoproject.com/en/1.7/ref/forms/api/…
Danilo Cabello

0

Thêm lỗi vào trường cụ thể:

form.add_error('fieldName', 'error description')

** Thêm lỗi vào trường không phải **

form.add_error(None, 'error description')
#Only pass None instead of field name
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.