Заполните форму Django (не для модели) - PullRequest
50 голосов
/ 01 июня 2009

Я пытаюсь предварительно заполнить данные в форме 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)

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

Ответы [ 4 ]

86 голосов
/ 01 июня 2009

Попробуйте:

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

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

Edit:

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

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

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

26 голосов
/ 02 июня 2009

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

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

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

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

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

form = MyForm(initial=data_dict)

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

14 голосов
/ 20 февраля 2013

Вы можете использовать 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

3 голосов
/ 27 августа 2017

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

Документы:

Пример кода:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...