Подтвердить что ты не робот

Предварительная подготовка формы Django (немодельной)

Я пытаюсь предварительно заполнить данные в форме django на основе некоторой информации, но НЕ использовать ModelForm, поэтому я не могу просто установить экземпляр.

Кажется, что это должно быть очень просто, но по какой-то причине я не могу найти документацию, рассказывающую мне, как это сделать. Это моя форма:

class MyForm(forms.Form):
  charfield1 = forms.CharField(max_length=3)
  charfield2 = forms.CharField(max_length=3)
  choicefield = forms.ModelChoiceField(MyModel.objects.all())

Я пробовал просто делать:

form = MyForm()
form.charfield1 = "foo"
form.charfield2 = "bar"
# a model choice field
form.choicefield = MyModel.objects.get(id=3)

который не работает.

4b9b3361

Ответ 1

Try:

form = MyForm({'charfield1': 'foo', 'charfield2': 'bar'})

Конструктор объектов Form может принимать словарь значений полей. Это создает связанную форму, которая может использоваться для проверки данных и отображения формы в виде HTML с отображаемыми данными. Подробнее см. документа API форм.

Edit:

Для полноты, если вы не хотите связывать форму, и просто хотите объявить начальные значения для некоторых полей, вы можете использовать следующее:

form = MyForm(initial={'charfield1': 'foo', 'charfield2': 'bar'})

Подробнее см. документацию начальные значения.

Ответ 2

Существует два способа заполнения формы Django.

Первый заключается в том, чтобы передать словарь в качестве первого аргумента при его создании (или передать его как data kwarg, что является одним и тем же). Это то, что вы делаете, когда хотите использовать данные POST для заполнения и проверки формы.

data_dict = {'charfield1': 'data1', 'charfield2': 'data2', 'choicefield': 3}
form = MyForm(data_dict)

Однако это приведет к проверке формы, поэтому работает только если вы действительно передаете действительные и полные данные для начала, иначе вы начнете с ошибок.

Другой способ заполнить форму - использовать параметр initial (документированный здесь). Это дает начальные значения для полей формы, но не вызывает проверки. Поэтому он подходит, если вы не заполняете все значения, например.

form = MyForm(initial=data_dict)

Чтобы заполнить поле выбора через initial, используйте значение pk.

Ответ 3

Вы можете использовать model_to_dict() для преобразования экземпляра в словарь, а затем заполнить форму этим. Что-то вроде этого должно работать:

from django.forms.models import model_to_dict
...
my_obj = MyModel.objects.get(abc=123)
form = MyForm(initial=model_to_dict(my_obj))

Примечание. Я использую версию django 1.3

Ответ 4

Для того, что стоит, способ просмотра FormView на основе классов для этого должен был бы переопределить функцию FormView get_initial. get_initial возвращает исходные аргументы ключевого слова, используемые get_form_kwargs для создания формы.

Docs:

Пример кода:

from django.views.generic.edit import FormView

class MyFormView(FormView):

    def get_initial(self):
        initial = super(MyFormView, self).get_initial()
        # update initial field defaults with custom set default values:
        initial.update({'charfield1': 'foo', 'charfield2': 'bar'})
        return initial