Saya memiliki formulir Django yang seharusnya memfilter pilihan menggunakan queryset:
class GenerateStudentAttendanceForm(forms.Form):
selected_class = forms.ModelChoiceField(queryset=Class.on_site.filter(
is_active=True,
academic_year__is_active=True
))
date = forms.DateField(initial=now().date())
Masalahnya adalah Class.on_site.filter
dievaluasi ketika formulir dipakai dan digunakan untuk permintaan berikutnya meskipun situs telah berubah.
Database API diperbarui ke sesuatu yang sedikit lebih modern, kueri disiapkan dan diparameterisasi untuk keamanan, dan kami membersihkan input pengguna dengan benar sebelum menggunakannya untuk memberi nama file.
0
Valery Melou
11 Oktober 2017, 12:29
1 menjawab
Jawaban Terbaik
Anda dapat membuat instance bidang dengan mengganti konstruktor kelas Form
sedemikian rupa sehingga set kueri dievaluasi pada setiap pembuatan formulir.
class GenerateStudentAttendanceForm(forms.Form):
date = forms.DateField(initial=now().date())
def __init__(self, *args, **kwargs):
super(GenerateStudentAttendanceForm, self).__init__(*args, **kwargs)
# add the key `selected_class` to the dictionary of `fields`
self.fields['selected_class'] = forms.ModelChoiceField(queryset=Class.on_site.filter(
is_active=True,
academic_year__is_active=True
))
1
Sachin
12 Oktober 2017, 01:31
1
Sepertinya Anda perlu memanggil
– super(GenerateStudentAttendanceForm, self).__init__(*args, **kwargs)
terlebih dahulu jika tidak, Anda akan mendapatkan 'GenerateStudentAttendanceForm' object has no attribute 'fields'
.
Valery Melou
11 Oktober 2017, 23:12
Benar. Saya menerapkan cara itu hanya di proyek saya.
– Sachin
12 Oktober 2017, 01:30
Saya juga diberi pemahaman, dari posting lain di sini di SO, bahwa metode
– update()
adalah cara yang andal untuk memaksa cache queryset dihapus. Anda mungkin dapat menggunakan ini entah bagaimana dengan cara yang disarankan oleh jawaban ini.
Mike Robinson
2 Februari 2020, 18:28
on_site
itu.