Django, настройка selected=selected на радиовходе

Простая форма с полем ModelChoiceField, отображаемым в виде переключателей (унаследованный виджет).

Я использую событие onchange для POST каждый раз, когда пользователь выбирает переключатель:

shipping_choice = ShippingChoiceField(
    queryset=ShippingMethods.objects.all(),
    empty_label=None,
    widget=forms.RadioSelect(attrs={
        'class': 'order',
        'onchange': '$("#shipping_choice").submit()',
    })
)

Мне нужно, чтобы радио, выбранное пользователем, действительно было «выбрано» при перезагрузке страницы.

Добавление дополнительного атрибута «выбрано» не подойдет, потому что это должно произойти, когда пользователь действительно сначала сделал выбор.


person panosl    schedule 25.07.2009    source источник


Ответы (2)


Формы имеют атрибут initial, который вы можете использовать:

form = YourForm(initial={'shipping_choice': current_choice})

Опять же, я предполагаю, что вы используете ModelForm, и в этом случае вы должны просто передать экземпляр:

form = YourForm(instance=order)   # where "order" is your instance...

Или, может быть, вы просто не понимаете, что форма может быть привязана к данным:

if request.method == 'POST':
    order_form = YourForm(data=request.POST)
else:
    order_form = YourForm()
person SmileyChris    schedule 25.07.2009
comment
Эй, приятель, нет, я не использую ModelForm, это форма предварительной проверки, которая просто проверяет, чтобы установить метод доставки (заказ создается на следующем шаге, потому что вся информация находится в сеансе). Я не уверен, что Initial поможет, потому что он предназначен только для первоначального отображения? Можно ли устанавливать его динамически каждый раз, когда пользователь выбирает другое радио и повторно отправляет форму? - person panosl; 25.07.2009
comment
Кроме того, я не уверен, как установить current_choice, так как мне нужно создать экземпляр формы, чтобы получить отправленное значение. - person panosl; 25.07.2009
comment
Я отредактировал свой ответ, включив в него раздел о том, как привязать форму к данным. Не пытаясь показаться покровительственным, вы прочитали документы. djangoproject.com/en/dev/ref/forms/api/#ref-forms-api ? - person SmileyChris; 27.07.2009

Ваш вопрос и последующий комментарий, к сожалению, не ясны. Что вы подразумеваете под отображением «при повторной отправке формы»?

Обычно процесс заключается в отображении формы, отправке, повторном отображении, если есть какие-либо ошибки, а затем переходе на страницу подтверждения. В какой момент у вас возникли проблемы? Или ваш поток значительно отличается от этого?

person Daniel Roseman    schedule 25.07.2009
comment
Извините, если было непонятно. Форма отображает радио-список shipping_options. Они различаются в зависимости от страны клиента. Эта фильтрация происходит в инициализации формы. Происходит только отправка, может происходить пересчет и отображение новой суммы пользователю, поэтому я вызываю отправку в событии onchange. Это отлично работает, за исключением того, что радио, которое было фактически выбрано, не отображается так (выбрано), когда представление возвращается (представление обрабатывает форму и повторно отображает ее). - person panosl; 25.07.2009