ใส่ข้อผิดพลาดลงในแบบฟอร์มที่ตรวจสอบแล้ว?


98

หลังจากที่ฉันform.Formตรวจสอบค่าอินพุตของผู้ใช้แล้วฉันจะส่งต่อไปยังกระบวนการแยกต่างหาก (ภายนอก) เพื่อประมวลผลต่อไป กระบวนการภายนอกนี้อาจพบข้อผิดพลาดเพิ่มเติมในค่า

มีวิธีในการแทรกข้อผิดพลาดเหล่านี้ลงในแบบฟอร์มที่ตรวจสอบแล้วเพื่อให้สามารถแสดงผ่านวิธีการแสดงข้อผิดพลาดแบบปกติ (หรือมีวิธีอื่นที่ดีกว่า) หรือไม่

ข้อเสนอแนะอย่างหนึ่งคือการรวมการประมวลผลภายนอกไว้ในการตรวจสอบความถูกต้องของแบบฟอร์มซึ่งไม่เหมาะอย่างยิ่งเนื่องจากกระบวนการภายนอกทำมากกว่าการตรวจสอบความถูกต้องเท่านั้น

คำตอบ:


94

Form._errorsสามารถปฏิบัติได้เหมือนพจนานุกรมมาตรฐาน ถือเป็นรูปแบบที่ดีในการใช้ErrorListชั้นเรียนและเพื่อเพิ่มข้อผิดพลาดในรายการที่มีอยู่:

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

และถ้าคุณต้องการที่จะเพิ่มข้อผิดพลาดที่ไม่ได้ข้อมูลการใช้งานdjango.forms.forms.NON_FIELD_ERRORS(ค่าเริ่มต้น"__all__") "myfield"แทน


3
สิ่งนี้ดูเหมือนจะไม่เป็นที่พอใจเล็กน้อยเนื่องจากชื่อ "_errors" แสดงให้เห็นว่าควรอยู่ภายในคลาสฟอร์ม นั่นเป็นวิธีมาตรฐานในการทำสิ่งนี้ใน Django หรือไม่? ฉันอยู่ในสถานการณ์ที่คล้ายคลึงกับ OP: ฉันมีแบบฟอร์มที่ผู้ใช้ระบุชื่อใหม่ที่ต้องไม่ซ้ำกันในฐานข้อมูล หากมีข้อผิดพลาดเกิดขึ้นฉันต้องการส่งแบบฟอร์มกลับโดยมีข้อผิดพลาด แต่ฉันไม่รู้จนกว่าฉันจะลองแทรกฐานข้อมูลจริงๆ (ในทางทฤษฎีตัวตรวจสอบความถูกต้องสามารถตรวจสอบฐานข้อมูลได้ แต่มีกลิ่นและมีแนวโน้มที่จะแข่งขันได้)
Weeble

1
@scompt: ขอบคุณแก้ไขแล้ว @Weeble: _errorsเป็นส่วนหนึ่งของ API รูปแบบสาธารณะแม้จะมีชื่อก็ตาม ดูคำตอบภายในสำหรับลิงก์เอกสาร
John Millikin

18
นี่ไม่ใช่ pythonic อย่างไม่น่าเชื่อ การติดตั้ง form.errors ['myfield']. append (my_error) หรือ form.add_error ('myfield', my_error) ทำได้ยากเพียงใด มีพื้นที่มากสำหรับข้อผิดพลาด (ไม่มีการเล่นสำนวน) ในการใช้งานปัจจุบัน
Michael

2
ส่วนใหญ่สมบูรณ์ หมายเหตุเพิ่มเติมอย่างหนึ่งคือถ้าไม่ได้เรียก is_valid () คุณจะต้องตั้งค่า form._errors = ErrorDict ()
jacob

12
@ Michael - ดูเหมือนว่าพวกเขารับคำแนะนำของคุณ ... Django Dev - Form.add_error (ฟิลด์ข้อผิดพลาด)
Clayton


14

คุณสามารถเพิ่มรายละเอียดข้อผิดพลาดเพิ่มเติมให้กับ_errorsแอตทริบิวต์ของแบบฟอร์มได้โดยตรง:

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


6
และเห็นได้ชัดว่าในเวอร์ชันพัฒนาหลัง 1.6 พวกเขากำลังเพิ่มadd_errorฟังก์ชั่น: docs.djangoproject.com/en/dev/ref/forms/api/…
brianmearns

และตอนนี้ Django 1.7 มีฟังก์ชัน add_error อย่างเป็นทางการแล้ว: docs.djangoproject.com/en/1.7/ref/forms/api/…
Danilo Cabello

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.