Menyetel nilai yang dipilih pada formulir Django. Bidang Pilihan


106

Berikut pernyataan lapangan dalam bentuk:

max_number = forms.ChoiceField(widget = forms.Select(), 
    choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

Saya ingin menetapkan nilai awal menjadi 3dan ini sepertinya tidak berhasil. Saya telah bermain-main dengan param, tanda kutip / tanpa tanda kutip, dll ... tetapi tidak ada perubahan.

Adakah yang bisa memberi saya jawaban pasti jika memungkinkan? Dan / atau perubahan yang diperlukan dalam potongan kode saya?

Saya menggunakan Django 1.0


Aku juga memikirkan hal yang sama. "awal" juga tidak bekerja dengan pilihan di versi trunk terbaru.
Ty.

Jawaban:


114

Coba tetapkan nilai awal saat Anda membuat contoh formulir:

form = MyForm(initial={'max_number': '3'})

3
Apakah '3'sesuai dengan nilai pertama tupel atau nilai kedua?
Bestasttung

4
tupel mewakili pasangan (nilai, label) untuk opsi dan Anda ingin menentukan nilai awal - jadi '3' merujuk ke item pertama.
Tom

95

Ini tidak menyentuh pertanyaan langsung yang ada, tetapi Q / A ini muncul untuk pencarian terkait dengan mencoba untuk menetapkan nilai yang dipilih ke ChoiceField .

Jika Anda telah memanggil super().__init__di kelas Formulir Anda, Anda harus memperbarui form.initialkamus, bukan field.initialproperti. Jika Anda belajar form.initial(misalnya print self.initialsetelah panggilan ke super().__init__), itu akan berisi nilai untuk semua bidang. Memiliki nilai Nonedi dict akan menimpafield.initial nilai.

misalnya

class MyForm(forms.Form):
    def __init__(self, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        # assign a (computed, I assume) default value to the choice field
        self.initial['choices_field_name'] = 'default value'
        # you should NOT do this:
        self.fields['choices_field_name'].initial = 'default value'

3
jika Anda tidak memahami jawaban ini, baca formulir django
ChillarAnand

1
Saya tidak yakin apakah karena jawaban ini sudah sangat lama sehingga ini tidak lagi berfungsi, tetapi saya tidak dapat membuat solusi ini berfungsi. Saya telah mencoba setiap kombinasi di atas dan tetap saya tidak mendapatkan cinta. Saya telah menanyakan pertanyaan ini lagi di sini: stackoverflow.com/questions/52191096/… Jika jawabannya masih sama, beri tahu saya apa yang salah dengan kode saya. Terima kasih!
Lehrian

48

Anda juga dapat melakukan hal berikut. dalam bentuk Anda kelas def:

max_number = forms.ChoiceField(widget = forms.Select(), 
                 choices = ([('1','1'), ('2','2'),('3','3'), ]), initial='3', required = True,)

lalu saat memanggil formulir dalam tampilan Anda, Anda dapat secara dinamis menyetel pilihan awal dan daftar pilihan.

yourFormInstance = YourFormClass()

yourFormInstance.fields['max_number'].choices = [(1,1),(2,2),(3,3)]
yourFormInstance.fields['max_number'].initial = [1]

Catatan: nilai awal harus berupa daftar dan pilihannya harus 2-tupel, dalam contoh saya di atas, saya memiliki daftar 2-tupel. Semoga ini membantu.


5
Mungkin perlu dicatat bahwa nilai initialmengacu pada kunci item yang akan dipilih, bukan indeksnya. Butuh beberapa kali percobaan untuk menyelesaikan ini!
BigglesZX

20

Saya mengalami masalah ini juga, dan menemukan bahwa masalahnya ada di browser. Saat Anda menyegarkan browser mengisi kembali formulir dengan nilai yang sama seperti sebelumnya, mengabaikan bidang yang dicentang. Jika Anda melihat sumber, Anda akan melihat nilai yang dicentang sudah benar. Atau letakkan kursor di kolom URL browser Anda dan tekan enter. Itu akan memuat ulang formulir dari awal.


1
Sekadar informasi, ini masih terjadi di FF6. Menekan tombol segarkan saja tidak cukup. Tapi di tombol refresh google chrome sudah cukup, tidak perlu pergi ke address bar
mhd

1
Saya pikir itu akan selalu terjadi di Firefox; itu perilaku yang diinginkan.
pendeta

Masih terjadi di Chrome 83, Anda menyelamatkan hidup saya!
lapin

7

Baik jawaban Tom dan Burton pada akhirnya berhasil untuk saya, tetapi saya mengalami sedikit kesulitan untuk mencari tahu bagaimana menerapkannya ke ModelChoiceField .

Satu-satunya trik untuk itu adalah bahwa pilihan disimpan sebagai tupel (<model's ID>, <model's unicode repr>), jadi jika Anda ingin menyetel pemilihan model awal, Anda meneruskan ID model sebagai nilai awal, bukan objek itu sendiri atau namanya atau yang lainnya. Maka sesederhana itu:

form = EmployeeForm(initial={'manager': manager_employee_id})

Alternatifnya, initialargumen dapat diabaikan sebagai pengganti baris tambahan dengan:

form.fields['manager'].initial = manager_employee_id

1
Baris kode kedua Anda berfungsi dengan sempurna di salah satu kasus yang jarang terjadi di mana Anda perlu menyetel nilai awal formulir setelah GETpermintaan dan menyetelnya dari dalam tampilan.
kstratis

3

Dave - apakah beruntung menemukan solusi untuk masalah browser? Apakah ada cara untuk memaksa penyegaran?

Adapun masalah aslinya, coba yang berikut ini saat menginisialisasi formulir:

def __init__(self, *args, **kwargs):
  super(MyForm, self).__init__(*args, **kwargs)   
  self.base_fields['MyChoiceField'].initial = initial_value

1
Ini tidak terlihat bagus. Dikutip dari django 1.3, forms.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
Tomas Tomecek

1

Untuk memastikan saya perlu melihat bagaimana Anda merender formulir. Nilai awal hanya digunakan dalam bentuk tak terikat, jika terikat dan nilai untuk bidang itu tidak disertakan, tidak ada yang akan dipilih.


-4

Coba ini berhasil untuk saya, saya telah menambahkan ini di models.py

options = (
    ('1','1'),
    ('2','2'),
    ('3','3')
)

max_number = forms.ChoiceField(max_length = 2, choices = options, default ='3')

6
Ini memberikan kesalahan dalam django 1.8.1: TypeError at /my/url/ __init__() got an unexpected keyword argument 'default' Request Method: GET Request URL: http://localhost:8000/my/url/ Django Version: 1.8.1 Exception Type: TypeError Exception Value: __init__() got an unexpected keyword argument 'default'
juliocesar
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.