Указание значения по умолчанию для скрытого поля формы django - Bone DRY? - PullRequest
3 голосов
/ 14 декабря 2010

Итак, скажем, в последнюю минуту (в представлении) я решил, что хочу указать значение по умолчанию для поля и сделать его скрытым, например:

form.fields['coconut'] = forms.ModelChoiceField(label="", widget=forms.HiddenInput(), queryset=swallow.coconuts.all(), initial=some_particular_coconut)

Мой вопрос такой:действительно нужно указать здесь набор запросов?Я имею в виду, я уже знаю, с самого начала, о каком именно кокосе я говорю.Почему мне также нужно указать, что вселенная доступных кокосов - это набор кокосов, которые эта конкретная ласточка несла (под шелухой)?

Можно ли как-то воздержаться от указания набора запросов?Простое пропускание приводит к тому, что django вызывает TypeError.

Если это действительно требуется, разве это не слишком влажно?

Ответы [ 3 ]

9 голосов
/ 29 ноября 2012

Я думаю, что хорошо, что ответы на stackoverflow указывают на «правильный» способ сделать что-то, но все чаще исходный вопрос остается без ответа, потому что пользователь пытался сделать что-то не то.Поэтому, чтобы непосредственно ответить на этот вопрос, вы можете сделать следующее:

form.fields['coconut'] = forms.ModelChoiceField(label="", widget=forms.HiddenInput(attrs={'value':some_particular_coconut}), queryset=swallow.coconuts.all())

Обратите внимание на именованный аргумент, переданный HiddenInput, его супер хакерский, но прямой ответ на исходный вопрос.

1 голос
/ 14 декабря 2010

Проблема в том, что вы пытаетесь настроить скрытый ModelChoiceField. Чтобы иметь выбор (выпадающий, традиционно), ему нужно знать свой выбор - вот почему вы даете набор запросов.

Но вы не пытаетесь предоставить пользователю выбор, верно? Это скрытый ввод, и вы устанавливаете его с сервера (так что он, вероятно, возвращается обратно).

Мое предложение состоит в том, чтобы попытаться вообще обойтись, используя скрытый ввод. Я нахожу их немного хакерскими. Но в противном случае, почему бы просто не указать текстовое поле с some_particular_coconut.id и скрыть это? В любом случае, модель использует только этот идентификатор.

0 голосов
/ 14 декабря 2010

Причина, по которой django требует набор запросов, заключается в том, что когда вы отображаете поле на странице, django отправляет только идентификатор.когда он возвращается, ему необходимо знание набора запросов для того, чтобы заново наполнить этот объект.если вы уже знаете набор запросов во время создания формы, почему бы просто не указать form.fields['coconut'].initial = some_particular_coconut в своем представлении и оставить оставшееся определение в вашем forms.py?

Если вы обнаружите, что вам действительно нужно отправитьидентификатор в любом случае (вам не нужно повторно раздувать объект на вашем конце), почему бы не отправить его в поле символа?

...