Я бы предложил написать вспомогательную фабричную функцию для вашего набора форм, чтобы вы могли настроить виджет отображения в соответствии с данными. Примерно так:
def make_entry_formset(initial_obj=None, custom_widget=forms.Textarea):
# these will be passed as keyword arguments to the ModelChoiceField
field_kwargs={'widget': custom_widget,
'queryset': Entity.objects.all()}
if initial_obj is not None:
field_kwargs.update({'initial': initial_obj})
class _EntryForm(forms.ModelForm):
entity = forms.ModelChoiceField(**field_kwargs)
class Meta:
model = Entry
return modelformset_factory(Entry, form=_EntryForm)
Затем в вашем коде просмотра вы можете указать виджет, который вы хотите, и связывать ли с начальным Entity
объектом. Для первоначального рендеринга набора форм, где вам нужен только виджет Textarea
и нет первоначального выбора, вы можете использовать это:
formset_class = make_entry_formset(custom_widget=forms.Textarea)
entry_formset = formset_class()
Затем, если вы хотите отрендерить его снова (после блока is_valid()
) с уже определенным объектом Entity
, вы можете использовать это:
formset_class = make_entry_formset(initial_obj=entity,
custom_widget=forms.HiddenInput)
entry_formset = formset_class(request.POST, request.FILES)
Конечно, вы можете использовать любой виджет, который вам нравится, но использование HiddenInput
не позволит конечному пользователю взаимодействовать с этим полем (которое, как вам кажется, вы хотите связать с переменной entity
, которую вы искали).