У меня есть модельный набор, который мне нужно передать ключевому слову initial in to (чтобы иметь некоторые начальные значения в наборе форм, например дата, установленная сегодня). Насколько я могу судить, аргумент queryset (который по умолчанию относится к MyModel.objects.all()) переопределяет эту способность для создания пустых форм. Я задал запрос как: YourModel.objects.none(), который не позволяет ему заполнить набор форм записями из базы данных, но я до сих пор не могу понять, как эффективно проходить исходный код. Мне нужно подклассифицировать метод из ModelForm?Передача начального значения в ModelFormSet Django
ответ
Простым решением может быть то, что вы передаете форму, которая расширяет форму модели() до набора форм (а не modelformset).
Таким образом, вы можете установить начальные значения в форме.
Можете ли вы рассказать об этом? Я не уверен, что понимаю, что вы имеете в виду. – Vince
Я думаю, что вы можете использовать первоначальный аргумент, так как с регулярным FormSets http://docs.djangoproject.com/en/dev/topics/forms/formsets/#using-initial-data-with-a-formset
Да, если это был обычный набор форм, это возможно. Однако этот набор форм был сгенерирован с помощью modelformset_factory(). – Vince
Это еще можно пройти начальные к ModelFormSet.
from django.forms.models import modelformset_factory
from example.models import ExampleModel
ExampleModelFormSet = modelformset_factory(ExampleModel)
formset = ExampleModelFormSet(initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
Если это не то, что вы после, можете ли вы объяснить свой вопрос больше.
EDIT:
ExampleModelFormSet = modelformset_factory(ExampleModel, extra=2)
formset = ExampleModelFormSet(queryset=ExampleModel.objects.none(),
initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
По умолчанию набор форм Django заполняет себя результатами вашего файла .mode.objects.all(). Это можно изменить с помощью queryset = yourmodel.objects.none(), но это все еще не позволяет использовать начальные значения. Что-то в том, что набор запросов и исходных ключевых слов делает это неработоспособным. – Vince
Как это не работает, что он не делает? Используя обновленный код, я получаю набор форм из пустого набора запросов и начальных значений, заполненных. – Gerry
Да, это путь. Согласен. – simplyharsh
Вы передаете пустой QuerySet в ModelFormset.
ExampleModelFormSet = modelformset_factory(ExampleModel, extra=2)
formset = ExampleModelFormSet(queryset=ExampleModel.objects.none(),
initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
, который действительно является способом достижения желаемого. Имеет смысл передать пустой запрос, иначе начальные значения переопределяют значение базы данных модели.
И если я полагаю, вы передаете непустой запрос, и все же хотите, чтобы ваши дополнительные формы были заполнены, будут начальные значения, вы можете переопределить Formset
.
from django.forms.models import modelformset_factory
ExampleFormset = modelformset_factory(OpenIDProfile, extra=3)
class myFormset(ExampleFormset):
def _construct_form(self, i, **kwargs):
"""
Instantiates and returns the i-th form instance in a formset.
"""
if self.is_bound and i < self.initial_form_count():
pk_key = "%s-%s" % (self.add_prefix(i), self.model._meta.pk.name)
pk = self.data[pk_key]
pk_field = self.model._meta.pk
pk = pk_field.get_db_prep_lookup('exact', pk)
if isinstance(pk, list):
pk = pk[0]
kwargs['instance'] = self._existing_object(pk)
if i < self.initial_form_count() and not kwargs.get('instance'):
kwargs['instance'] = self.get_queryset()[i]
defaults = {'auto_id': self.auto_id, 'prefix': self.add_prefix(i)}
if self.data or self.files:
defaults['data'] = self.data
defaults['files'] = self.files
# Check to confirm we are not overwriting the database value.
if not i in range(self.initial_form_count()) and self.initial:
try:
defaults['initial'] = self.initial[i - self.initial_form_count()]
except IndexError:
pass
# Allow extra forms to be empty.
if i >= self.initial_form_count():
defaults['empty_permitted'] = True
defaults.update(kwargs)
form = self.form(**defaults)
self.add_fields(form, i)
return form
Примечание: initial
- это список диктов. Желательно иметь элементы в списке, в точности равные количеству дополнительных.
Один трюк, который достал меня здесь, заключается в том, что вы должны установить больше, чем или равное количеству элементов в ваших исходных данных. Я знаю, что это в вашем ответе, но я подумал, что это стоит выделить. – Bacon
После этого вы можете изменить исходные данные.
Например:
# Construct the FormSet class
ExampleFormSet = modelformset_factory(ParentModel, ChildModel)
# Set the initial data
initial_data = {'field1': 1}
for form in ExampleFormSet.extra_forms:
for field in form.fields:
field.initial = initial_data[field.name]
Когда я пытаюсь это сделать (с formet_factory), я получаю объект ''str' не имеет атрибута 'initial'' Что я могу делать неправильно? – LukasKawerau
@LukasKawerau: проверьте, что возвращает 'form.fields'. Этот код может потребовать исправления. – vdboor
@LukasKawerau, в python 2.7 (по крайней мере) итерация по словарю gies только ключи не данные – maazza
Новый в Django 1.4 ... если вы установите начальными на modelformset теперь применяется только к «дополнительным» формам, а не тем, которые связан с экземплярами из QuerySet:
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#providing-initial-values
Таким образом, новые хаки больше не нужны, и использование начального ответа является ответом.
В Django 1.4 правило изменилось: количество инициалов, которые должны отображаться, соответствует параметру «extra». https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#providing-initial-values
В моем случае подсчет начальных параметров изменяется динамически, поэтому я нашел следующий способ:
initial=[{'name': 'Some Name'},{'name': 'Another Name'}]
formset = ExampleModelFormSet(queryset=ExampleModel.objects.none(),
initial=initial, extra=len(initial))
class MyBaseFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
self.extra = kwargs.pop('extra', self.extra)
super(MyBaseFormSet, self).__init__(*args, **kwargs)
при условии, ExampleModelFormSet основан на MyBaseFormSet
Простого способом, как пройти начальным данные с тем же количеством дополнительных форм:
MyModelFormSet = lambda *a, **kw: modelformset_factory(MyModel, extra=kw.pop('extra', 1))(*a, **kw)
Использование в vi овости:
initial=[{'name': 'Some Name'},{'name': 'Another Name'}
formset = MyModelFormSet(queryset=MyModel.objects.none(), initial, extra=len(initial))})
Affter два дня нашел это: http://streamhacker.com/2010/03/01/django-model-formsets/
def custom_field_callback(field):
return field.formfield(required=False)
FormSet = modelformset_factory(model, formfield_callback=custom_field_callback)
def custom_field_callback(field):
if field.name == 'optional':
return field.formfield(required=False)
elif field.name == 'text':
return field.formfield(widget=Textarea)
elif field.name == 'integer':
return IntegerField()
else:
return field.formfield()
Лучший способом я нашел, чтобы сделать это просто вручную настроить «лишний» атрибут объекта formset после инициализации. Это было протестировано и работает в Django 1.9.
ExampleModelFormSet = modelformset_factory(ExampleModel, extra=1)
formset = ExampleModelFormSet(initial=[{'name': 'Some Name'},
{'name': 'Another Name'}])
formset.extra = 3
Это будет выплеснуть 3 формы (2 предварительно заполненных и 1 пробел).
Если вы хотите что-то более динамичное (например initial
является вар рассчитывается где-то еще), вы можете сделать что-то вроде этого:
ExampleModelFormSet = modelformset_factory(ExampleModel, extra=1)
formset = ExampleModelFormSet(initial=initial)
formset.extra += len(initial)
Надежда, что помогает.
- 1. Как сохранить Django ModelFormSet?
- 2. Установка начального значения Django ModelChoiceField
- 3. Настройка полей modelformset в Django
- 4. Scala: передача начального значения NULL в foldLeft
- 5. Django - определение начального значения ForeignField в Admin
- 6. django modelformset создать один объект
- 7. Передача начального значения компоненту пользовательского ввода
- 8. Как установить django ModelFormset widget?
- 9. Как установить InlineFormSet в ModelFormSet в Django?
- 10. DJANGO Неисправность для ввода начального значения MultipleChoiceField
- 11. Django Admin: переопределение начального значения для строк
- 12. Форма Django: установка начального значения на DateField
- 13. Modelformset в django generic CreateView и UpdateView
- 14. Как получить экземпляр формы в modelformset django
- 15. Сохраните порядок полей в Django Modelformset
- 16. Изменение типа поля в Django ModelFormset
- 17. Django ModelFormSet исключает (или фильтрует) существующие элементы
- 18. Django: ModelFormSet с сохранением только первой записи
- 19. модульное тестирование django ModelFormset методы очистки
- 20. Django ModelFormSet с движком Google для приложений
- 21. исправляющие нулевые значения на связанном ModelFormSet
- 22. Задачи начального значения массива
- 23. Установки начального значения PasswordBox
- 24. Отображение начального значения ввода
- 25. Установка начального значения в UIPicker
- 26. Передача значения внешнего ключа в Django
- 27. Передача значения в пользовательскую функцию? django noob
- 28. Искажение начального значения пуска
- 29. Передача экземпляра/значения по умолчанию в ModelFormSet для пустых форм для использования в представлении
- 30. django save (commit = False) vs установка начального значения
Вы хотите изменить конкретный экземпляр модели, но не хотите отображать существующие значения и вместо этого отображать разные начальные значения? –