Встановлення вибраного значення на формах Django.ChoiceField


106

Ось польова декларація у формі:

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

Я хотів би встановити початкове значення таким, яке буде, 3і це, здається, не працює. Я грав з парам, цитатами / без цитат тощо ... але жодних змін.

Чи міг би хтось дати мені остаточну відповідь, якщо це можливо? І / або потрібне підключення у моєму фрагменті коду?

Я використовую Django 1.0


Мені було цікаво те саме. "початковий" також не може працювати з вибором в останній версії магістралі.
Тай.

Відповіді:


114

Спробуйте встановити початкове значення, коли ви формулюєте форму:

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

3
Чи '3'відповідає першому значенню кортежу чи другому?
Bestasttung

4
кортежі представляють (значення, мітка) пари для параметрів, і ви хочете вказати початкове значення - тому "3" відноситься до першого пункту.
Том

95

Це не стосується безпосереднього питання, однак це запитання / запитання приходить до пошуків, пов'язаних із спробою присвоїти вибране значення а ChoiceField.

Якщо ви вже зателефонували super().__init__у свій клас Form, вам слід оновити form.initialсловник, а не field.initialвластивість. Якщо ви вивчаєте form.initial(наприклад, print self.initialпісля дзвінка до super().__init__), він буде містити значення для всіх полів. Значення Noneв цьому дикті буде перевершувати field.initialзначення.

напр

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
якщо ви не розумієте цієї відповіді, прочитайте цю форму джанго gotchas
ChillarAnand

1
Я не впевнений, чи це тому, що ця відповідь настільки стара, що це більше не працює, але я не в змозі змусити це рішення працювати. Я перепробував кожне з вищезазначених поєднань і досі не отримую любові. Я знову поставив це запитання тут: stackoverflow.com/questions/52191096/… Якщо відповідь все одно той же, будь ласка, дайте мені знати, що не так з моїм кодом. Дякую!
Леріан

48

Ви також можете зробити наступне. у вашому класі класу def:

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

то при виклику форми у вашому вікні ви можете динамічно встановлювати як початковий вибір, так і список вибору.

yourFormInstance = YourFormClass()

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

Примітка: початкові значення повинні бути списком, а вибір має бути 2-кортежами, у моєму прикладі вище у мене є список 2-кортезів. Сподіваюся, це допомагає.


5
Можливо, варто відзначити, що значення initialпосилається на ключ елемента, що вибирається, а не на його індекс. Взяв у мене пару спроб, щоб це вирішити!
BigglesZX

20

Я також зіткнувся з цією проблемою і зрозумів, що проблема полягає в браузері. Під час оновлення браузер повторно заповнює форму тими ж значеннями, що і раніше, ігноруючи перевірене поле. Якщо ви переглядаєте джерело, ви побачите, що перевірене значення є правильним. Або введіть курсор у поле URL-адреси веб-переглядача та натисніть клавішу Enter. Це знову завантажить форму з нуля.


1
просто так, це все ще відбувається в FF6. Натиснути кнопку оновлення недостатньо. Але в Google Chrome кнопка оновлення є достатньою, не потрібно заходити в адресний рядок
mhd

1
Я думаю, що це буде завжди у Firefox; це призначена поведінка.
thepeer

Все ще трапляється в Chrome 83, ти врятував мені життя!
lapin

7

І відповіді Тома, і Бертона спрацьовують для мене врешті-решт, але у мене виникли невеликі труднощі, розгадуючи, як застосувати їх до а ModelChoiceField.

Єдиний фокус у тому, що вибір зберігається у вигляді кортежів (<model's ID>, <model's unicode repr>), тому якщо ви хочете встановити початковий вибір моделі, ви передаєте ідентифікатор моделі як початкове значення, а не сам об’єкт чи його ім'я чи щось інше. Тоді це так просто, як:

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

Крім того, initialаргумент можна ігнорувати замість додаткового рядка з:

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

1
Ваш другий рядок коду працює бездоганно в одному з тих рідкісних випадків, коли після GETзапиту потрібно встановити початкове значення форми та встановити її зсередини представлення даних.
kstratis

3

Дейв - якась удача знайти рішення проблеми браузера? Чи є спосіб змусити оновити?

Що стосується початкової проблеми, спробуйте виконати наступне при ініціалізації форми:

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

1
Це не добре виглядає. Цитується з django 1.3, form.py:93:Instances should always modify self.fields; they should not modify self.base_fields.
Tomas Tomecek

1

Щоб бути впевненим, мені потрібно подивитися, як ви надаєте форму. Початкове значення використовується лише у незв'язаній формі, якщо воно пов'язане і значення для цього поля не включене, нічого не буде обрано.


-4

Спробуйте це працює для мене, я додав це в models.py

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

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

6
Це дало помилку в 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.