Buat queryset kosong secara default di bidang formulir Django


169

Saya memiliki bidang ini dalam bentuk:

city = forms.ModelChoiceField(label="city", queryset=MyCity.objects.all())
district = forms.ModelChoiceField(label="district", queryset=MyDistrict.objects.all())
area = forms.ModelChoiceField(label="area", queryset=MyArea.objects.all())

kabupaten berasal dari klik pada kota dan daerah berasal dari klik pada daerah. Dengan queryset=MyDistrict.objects.all()dan queryset=MyArea.objects.all()bentuk akan sangat berat. Bagaimana saya bisa membuat queryset kosong secara default?


edit yang saya sarankan meningkatkan posting. Secara umum, tidak ada posting yang harus diakhiri dengan "terima kasih". Itu bukan pribadi, bud. meta.stackexchange.com/questions/17878/…
Telarian

Jawaban:


422

Anda dapat memiliki queryset kosong dengan melakukan ini:

MyModel.objects.none()

Meskipun saya tidak tahu bagaimana Anda akan menggunakan formulir itu, Anda dapat menempatkan itu sebagai kueryset bidang Anda untuk mendapatkan apa yang Anda butuhkan ...

Anda dapat menemukan informasi lebih lanjut di sini


4
Dalam kasus penggunaan, kueryset Anda berubah dalam tampilan Anda berdasarkan parameter url. Kemudian dalam tampilan Anda, Anda mengatur queryset yang benar seperti: edit_form.fields ["asset"]. Queryset = Asset.objects.filter (location_id = location_id)
radtek

Bagaimana jika saya tidak memiliki model, saya hanya melakukan values_list('something', flat=True)?
Boris

2

@ radtek ini komentar harus jawaban seperti itu berguna dalam skenario yang sama tetapi dengan pendekatan yang berbeda dari jawaban yang diterima.

Jika kueryset Anda berubah dengan url di tampilan Anda.

Saya memperluas jawaban dengan contoh seperti yang saya gunakan:

def my_view(request):
    ...
    form = YourForm(initial={'field1':value1, 'field2':value2})
    form.fields['field3'].queryset = YourModel.objects.filter('foo'=bar)
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.