2008-10-09 40 views
80

Sau khi xác thực giá trị nhập của người dùng, tôi chuyển chúng đến một quy trình riêng (bên ngoài) để xử lý tiếp. Quá trình bên ngoài này có khả năng tìm thêm các lỗi trong các giá trị.Tiêm các lỗi vào biểu mẫu đã được xác thực?

Có cách nào để đưa các 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ó cách tiếp cận thay thế tốt hơn) không?

Một đề xuất là bao gồm việc xử lý bên ngoài trong quá trình xác nhận 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 thực.

Trả lời

84

Form._errors có thể bị đối xử như một cuốn từ điển thông thường. Nó được coi là hình thức tốt để sử dụng lớp ErrorList, và để nối thêm lỗi vào danh sách hiện có:

from django.forms.util 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 thực địa, sử dụng django.forms.forms.NON_FIELD_ERRORS (mặc định là "__all__") thay vì "myfield".

+0

Để khớp với những gì Django's làm, bạn nên chèn các đối tượng ErrorList. –

+1

Điều này có vẻ hơi khó chịu, vì tên "_errors" gợi ý rằng nó được cho là nằm trong lớp biểu mẫu. Đó có phải là cách tiêu chuẩn để làm điều này ở Django không? Tôi đang ở trong một tình huống tương tự như OP: Tôi có một hình thức mà người dùng cung cấp một tên mới mà phải là duy nhất trong cơ sở dữ liệu. Nếu có một vụ va chạm tôi muốn gửi biểu mẫu trở lại với một 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 duyệt tính hợp lệ có thể kiểm tra cơ sở dữ liệu, nhưng nó có mùi và dễ bị đua.) – Weeble

+1

@scompt: cảm ơn, cố định. @ Weeble: '_errors' là 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. –

14

Bạn có thể thêm chi tiết lỗi bổ sung cho _errors thuộc tính của hình thức trực tiếp:

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

+5

Và rõ ràng trong phiên bản 1.6 phát triển bưu điện, họ đang bổ sung thêm một 'add_error' chức năng: https://docs.djangoproject.com/en/dev/ref/forms/api/#django .forms.Form.add_error – brianmearns

+0

Và bây giờ Django 1.7 có chức năng add_error chính thức: https://docs.djangoproject.com/en/1.7/ref/forms/api/#django.forms.Form.add_error –

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