Поле ModelChoiceField в ModelFormSet не выбирает начальное значение при использовании пользовательской ModelForm
Я использую ModelFormSet для отображения списка форм на основе предопределенной ModelForm. Мне нужно настроить два поля в формах, и поэтому я создал эту ModelForm:
# forms.py
class StudentRelationshipForm(forms.ModelForm):
# the row below causes the issue:
classroom = forms.ModelChoiceField(queryset=Classroom.objects.all(), widget=forms.Select(attrs={'class':'form-control border-0 bg-white text-black h5'}), to_field_name='clarsroom_name', disabled=True, required=True)
student_type = forms.ChoiceField(choices=StudentRelatuionship.STUDENT_TYPES, widget=forms.Select(attrs={'class': 'form-control'}), required=True)
class Meta:
model = StudentRelatuionship
fields = [
'classroom',
'student_type',
]
Я создаю ModelFormSet в следующем представлении:
# views.py
....
class MyView(DetailView):
def get_context_data(self, **kwargs):
classroom_list = [ a list of classrooms goes here ]
initial_formset_data = []
for classroom in related_companies:
initial_formset_data.append({'classroom': classroom.pk})
StudentRelationshipFormSet = modelformset_factory(StudenrRelatuionship, form=StudentRelatuionshipForm, fields=['classroom', 'student_type'], extra=formset_extras)
context['investor_relationships_formset'] = StudentRelationshipFormSet(queryset=StudentRelatuionship.objects.filter(student=self.request.user.user_profile, classroom__in=classroom_list), initial=initial_formset_data)
....
По сути, проблема, с которой я столкнулся, заключается в том, что когда я указываю поле classroom
в StudentRelationshipForm
в forms.py
, значение по умолчанию виджета HTML Select становится ---------
. Однако, если я удалю строку из forms.py, виджет HTML select корректно выбирает название класса из базы данных при редактировании существующего экземпляра
Как я могу это преодолеть? Причина, по которой мне нужна строка, заключается в том, чтобы указать, что поле должно быть отключено. Если есть другой способ достичь этого, пожалуйста, скажите мне.
P.S.: Мне нужно, чтобы disabled=True была в форме, а не в шаблоне, потому что disabled=True не позволяет пользователю отправить ввод, отличный от первоначального, даже если он изменит источник HTML.
Мне удалось решить проблему, указав атрибуты поля в __init__
из Form
:
class StudentRelationshipForm(forms.ModelForm):
...
def __init__(self, *args, **kwargs):
super(StudentRelationshipForm, self).__init__(*args, **kwargs)
self.fields['classroom'].disabled = True
self.fields['classroom'].required = True