Masukkan kesalahan ke dalam formulir yang sudah divalidasi?


97

Setelah saya form.Formmemvalidasi nilai input pengguna, saya meneruskannya ke proses terpisah (eksternal) untuk diproses lebih lanjut. Proses eksternal ini berpotensi menemukan kesalahan lebih lanjut dalam nilai.

Apakah ada cara untuk memasukkan kesalahan ini ke dalam formulir yang sudah divalidasi sehingga dapat ditampilkan melalui metode tampilan kesalahan formulir biasa (atau adakah pendekatan alternatif yang lebih baik)?

Salah satu saran adalah memasukkan pemrosesan eksternal dalam validasi formulir, yang tidak ideal karena proses eksternal melakukan lebih dari sekadar memvalidasi.

Jawaban:


92

Form._errorsdapat diperlakukan seperti kamus standar. Ini dianggap sebagai bentuk yang baik untuk menggunakan ErrorListkelas, dan untuk menambahkan kesalahan ke daftar yang ada:

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

Dan jika Anda ingin menambahkan kesalahan non-bidang, gunakan django.forms.forms.NON_FIELD_ERRORS(default ke "__all__") sebagai ganti "myfield".


2
Ini tampaknya sedikit tidak menyenangkan, karena nama "_errors" menyarankan itu seharusnya internal ke kelas formulir. Apakah itu cara standar untuk melakukan ini di Django? Saya dalam situasi yang mirip dengan OP: Saya memiliki formulir di mana pengguna memberikan nama baru yang harus unik dalam database. Jika ada tabrakan, saya ingin mengirim formulir kembali dengan kesalahan di atasnya, tetapi saya tidak akan tahu sampai saya benar-benar mencoba melakukan penyisipan database. (Secara teori, validator dapat memeriksa database, tetapi itu berbau dan rentan terhadap balapan.)
Weeble

1
@scompt: terima kasih, sudah diperbaiki. @Weeble: _errorsadalah bagian dari API formulir publik, terlepas dari namanya; lihat jawaban di dalam untuk link dokumen.
John Millikin

18
Ini sangat non pythonic. Seberapa sulit mengimplementasikan form.errors ['myfield']. Append (my_error) atau form.add_error ('myfield', my_error)? Terlalu banyak ruang untuk kesalahan (tidak ada permainan kata-kata) dalam implementasi saat ini.
Michael

2
Paling lengkap. Satu catatan tambahan adalah jika is_valid () tidak dipanggil, maka Anda harus menyetel form._errors = ErrorDict ()
jacob

12
@ Michael - sepertinya mereka menerima saran Anda ... Django Dev - Form.add_error (bidang, kesalahan)
Clayton


14

6
Dan ternyata dalam versi pengembangan 1.6, mereka menambahkan add_errorfungsi: docs.djangoproject.com/en/dev/ref/forms/api/…
brianmearns

Dan sekarang Django 1.7 mempunyai fungsi add_error resmi: docs.djangoproject.com/en/1.7/ref/forms/api/…
Danilo Cabello

0

Tambahkan kesalahan ke bidang tertentu:

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

** Tambahkan kesalahan ke non bidang **

form.add_error(None, 'error description')
#Only pass None instead of field name
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.