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
Apakah Anda mengatakan bahwa bahkan jika salah satu objek Kelas dihapus, itu masih tersedia di drop-down?
 – 
Sandeep Balagopal
11 Oktober 2017, 13:01
Saya tidak mencobanya tetapi sepertinya begitu, karena kelas yang ditampilkan berasal dari situs default.
 – 
Valery Melou
11 Oktober 2017, 13:24
Anda perlu menunjukkan apa on_site itu.
 – 
Daniel Roseman
11 Oktober 2017, 13:25
Saya menggunakan situs Django cintrib untuk melayani aplikasi di beberapa domain. on_site hanya akan mengembalikan kelas dari situs saat ini.
 – 
Valery Melou
11 Oktober 2017, 13:50

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