Saya mencoba mengatur bidang ke nilai tertentu setelah formulir diinisialisasi.
Misalnya, saya memiliki kelas berikut.
class CustomForm(forms.Form):
Email = forms.EmailField(min_length=1, max_length=200)
Dalam pandangan, saya ingin dapat melakukan sesuatu seperti ini:
form = CustomForm()
form["Email"] = GetEmailString()
return HttpResponse(t.render(c))
ModelChoiceField
masih memberikan invalid_choice ketika saya memberikaninitial
nilai :(form.data['Email'] = GetEmailString()
dan berhasilform.fields['Email'].initial = GetEmailString()
Theform.fields['keyword'].initial
memberi Anda akses untuk menginisialisasi nilai-nilai Anda bahkan setelah instanciated formulir AndaJika Anda sudah menginisialisasi formulir, Anda dapat menggunakan properti awal bidang. Sebagai contoh,
sumber
Jika Anda ingin melakukannya dalam metode formulir
__init__
karena alasan tertentu, Anda dapat memanipulasiinitial
dict:sumber
Sesuatu seperti Nigel Cohen akan bekerja jika Anda menambahkan data ke salinan dari kumpulan data formulir yang dikumpulkan:
sumber
data[form.add_prefix('Email')]
untuk memperhitungkan kasus-kasus di mana awalan ditetapkan.form.data = form.data.copy()
modelform_factory
. Dengan cara ini Anda bisa menghasilkan kelas Formulir yang tidak memiliki bidang yang tidak Anda inginkan. Sangat berbahaya memiliki kelas Formulir yang memiliki bidang yang tidak dirender karena objek formulir masih akan menerima data untuk bidang yang tidak dirender. Seorang penyerang bisa menggunakan ini untuk keuntungan mereka.Jika sudah menginisialisasi form seperti ini
Maka cara yang benar per Jan 2019 , gunakan
.initial
untuk mengganti data. Ini akan menggantikan data dalamintial
dikt yang sesuai dengan formulir. Ini juga berfungsi jika Anda telah menginisialisasi menggunakan beberapa contoh sepertiform = CustomForm(instance=instance)
Untuk mengganti data di formulir, Anda perlu
Menggeneralisasi ini akan menjadi,
sumber
Ubah saja bidang Form.data Anda:
sumber
Untuk membuang cara lain ke dalam campuran: ini juga berfungsi, dengan notasi yang sedikit lebih modern. Ini hanya bekerja di sekitar fakta bahwa a
QueryDict
tidak dapat diubah.sumber
di widget gunakan 'nilai' attr. Contoh:
sumber
Cara lain untuk melakukan ini, jika Anda telah menginisialisasi formulir (dengan atau tanpa data), dan Anda perlu menambahkan data lebih lanjut sebelum menampilkannya:
sumber