2011-12-22 32 views
8

Tôi có một biểu mẫu với nhiều trường. Tôi có các kiểm tra xác thực riêng cho mỗi trường, được thực hiện thông qua xác nhận biểu mẫu. Tuy nhiên, tôi cũng cần phải kiểm tra xem có ít trường được điền vào trước khi chuyển hướng người dùng đến một chế độ xem khác không. Tôi đã hy vọng tôi bằng cách nào đó có thể thêm lỗi để forms.non_field_errors vì nó không phải là cho một lĩnh vực cụ thể, nhưng tôi không chắc chắn cú pháp đúng cho điều này sẽ được. Tôi đã kiểm tra trực tuyến và tìm thấy ..Cách thêm thông báo lỗi vào form.non_field_errors bằng django?

form.errors['__all__'] = form.error_class(["error msg"]) 

Điều này sẽ hiển thị thông báo lỗi, nhưng có vẻ như làm lộn xộn các trang khác và bỏ qua thông báo lỗi nếu tôi nhấp vào bất kỳ điều gì khác.

tôi đã cố gắng

form._errors[NON_FIELD_ERRORS] = form.error_class() 

Điều này làm cho đối tượng một 'NoneType' không có thuộc tính lỗi 'setdefault' cho tôi.

Tôi đã thử

form.non_field_errors().append("Please complete your profile in order to access the content.") 

này dường như không làm gì cả và tôi không thể nhìn thấy thông báo lỗi trên xem.

Cách tốt nhất để làm điều này là gì? Lý tưởng nhất là tôi không muốn làm điều đó trong phương thức sạch của form. Tôi cảm thấy mình có thể thêm lỗi vào biểu mẫu trong chế độ xem.

Trả lời

17
  1. Gọi full_clean(), điều này sẽ khởi form._errors. Bước này rất quan trọng, nếu bạn không làm điều đó, nó sẽ không hoạt động.

  2. Tận dụng danh sách lỗi, phải mất một danh sách các bài viết, instanciate nó như vậy: error_list = form.error_class(['your error messages'])

  3. Gán danh sách lỗi để NON_FIELD_ERRORS, bạn phải nhập NON_FIELD_ERRORS từ django.forms.forms, sau đó gán như ví dụ: form._errors[NON_FIELD_ERRORS] = error_list

Dưới đây là một minh chứng từ một vỏ:

In [1]: from bet.forms import BetForm 

In [2]: from django.forms.forms import NON_FIELD_ERRORS 

In [3]: form = BetForm() 

In [4]: form.full_clean() 

In [5]: form._errors[NON_FIELD_ERRORS] = form.error_class(['your error messages']) 

In [6]: form.non_field_errors() 
Out[6]: [u'your error messages'] 
+0

Tôi biết tôi có thể làm điều đó trong phương thức Form.clean().Tuy nhiên tôi muốn làm điều đó trong quan điểm và chỉ cần thêm một lỗi vào danh sách form.errors, là điều này có thể ở tất cả? – Angela

+0

Vâng vâng nó có thể câu trả lời của tôi chứng minh nó :) – jpic

+0

Cảm ơn jpic cho câu trả lời chi tiết của bạn. Tôi sẽ thử đoạn mã này và quay lại. Xin lỗi vì câu trả lời muộn, tôi đã đi nghỉ mát. – Angela

4

Đây là một chút lỗi thời nhưng gần đây tôi đã chạy vào cùng một câu hỏi và muốn làm sáng tỏ thêm về điều này cho người đọc trong tương lai.

  1. Tính đến Django 1.6 + điển lỗi được lưu giữ như form.errors và không form._errors
  2. Nếu bạn nhanh chóng form.is_valid(), nó là tương đương với việc chạy full_clean()
  3. NON_FIELD_ERRORS không cần thiết phải nhập khẩu, bạn chỉ có thể tham khảo chủ chốt từ điển mặc định của __all__

Ví dụ:

if form.is_valid(): 
    form.errors['__all__'] = form.error_class(['Your Error Here!']) 
+3

Nói chung, tốt hơn là nên sử dụng các hằng số được định nghĩa, tức là. 'NON_FIELD_ERRORS' trên giá trị' __all__'. Ngoài ra, theo như tôi hiểu, điểm thiết lập các lỗi trường không ** trước khi ** gọi 'is_valid()' là có thể thực sự ảnh hưởng đến kết quả của 'is_valid()'. – jpic

+0

Tôi đồng ý với phần không đổi NON_FIELD_ERRORS, tôi chỉ muốn chỉ ra một giải pháp thay thế. Đối với các thiết lập không phải lĩnh vực lỗi, những gì tôi đã cố gắng để nói là không trường-lỗi không instantiated trừ khi is_valid() hoặc full_clean() được gọi là ở tất cả. Nếu bạn thử truy cập trước khi chạy một trong hai phương pháp bạn sẽ nhận được một KeyError. Trừ khi những gì bạn đang cố gắng để nói là một trong những nên chạy full_clean() trước khi chạy is_valid()? – asaji

+0

Điều này có đầy đủ thông tin sai lạc: form.errors là thuộc tính truy cập vào biểu mẫu danh sách nội bộ._errors. Và thực hành tốt là sử dụng NON_FIELD_ERRORS làm hằng số vì các nhà phát triển có thể đột nhiên quyết định rằng hằng số phải tương đương với chuỗi "_la_le_loo_". Đó là lý do tại sao chúng tôi có hằng số bằng ngôn ngữ - vì vậy chúng tôi có thể tóm tắt và duy trì mã của chúng tôi dễ dàng hơn. Ngoài ra, form.is_valid() không phải là tương đương với chạy full_clean(). is_valid() gọi form.errors, gọi full_clean để điền từ điển _errors. – Bobort

0

self._errors.setdefault('__all__', ErrorList()).extend([""])

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