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.

Parand
sumber

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".

John Millikin
sumber
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

Anda dapat menambahkan detail kesalahan tambahan ke _errorsatribut formulir secara langsung:

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

Jonny Buchanan
sumber
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
Tarif Muhammad Faizan
sumber