Предварительная подготовка формы 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)
который не работает.
Ответы
Ответ 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:
- для
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