Наследование форм Django 1.9 на UpdateView
Проблема у меня с одним полем, которое я добавил.
У меня есть моя форма:
class employeesForm(forms.ModelForm):
class Meta:
fields = [
'num_employee',
'id_ignition',
'fullName',
'shortName',
'salary',
'gender',
'rfc',
'imss',
'curp',
'birthday',
'initday',
'id_costCenter',
'id_jobCode',
'id_status',
'nationality',
'picture',
'source',
]
widgets = {
'num_employee': forms.NumberInput(attrs={'class': 'form-control', 'name': 'num_employee'}),
'id_ignition': forms.NumberInput(attrs={'class': 'form-control', 'name': 'id_ignition'}),
'fullName': forms.TextInput(attrs={'class': 'form-control', 'name': 'fullName', 'placeholder': 'Angel Rafael Ortega Vazquez'}),
'shortName': forms.TextInput(attrs={'class': 'form-control', 'name': 'shortName', 'placeholder': 'Rafael Ortega'}),
'salary': forms.NumberInput(attrs={'class': 'form-control', 'name': 'salary', 'placeholder': '5000'}),
'gender': forms.CheckboxInput(attrs={'class': 'form-control', 'name': 'gender'}),
'rfc': forms.TextInput(attrs={'class': 'form-control', 'name': 'rfc', 'id': 'rfc'}),
'imss': forms.TextInput(attrs={'class': 'form-control', 'name': 'imss', 'id': 'imss'}),
'curp': forms.TextInput(attrs={'class': 'form-control', 'name': 'curp'}),
'birthday': forms.DateInput(attrs={'class': 'form-control', 'name': 'birthday'}),
'initday': forms.DateInput(attrs={'class': 'form-control', 'name': 'initday'}),
'id_costCenter': forms.Select(attrs={'class': 'form-control', 'name': 'id_costCenter'}),
'id_jobCode': forms.Select(attrs={'class': 'form-control', 'name': 'id_jobCode'}),
'id_status': forms.Select(attrs={'class': 'form-control', 'name': 'id_status'}),
'nationality': forms.Select(attrs={'class': 'form-control', 'name': 'nationality'}),
'picture': forms.ClearableFileInput(attrs={'class': 'form-control', 'name': 'picture'}),
'source': forms.Select(attrs={'class': 'form-control', 'name': 'source'}),
}
В моей модели у меня есть дополнительное поле (древность), но я здесь его игнорирую, потому что в моем CreateView я заполняю это поле на основе других параметров (antiquity = initday).
Все работало нормально, пока мне не понадобилось создать UpdateView с предварительно заполненным этим дополнительным полем, что я сделал, чтобы унаследовать форму предварительного просмотра и добавить это дополнительное поле:
class Enhanced_employeesForm(employeesForm):
antiquity = forms.CharField(
widget=forms.DateInput(attrs={'class': 'form-control', 'name': 'antiquity'}))
Это помогло, поле ввода отображается в моем шаблоне, но, хотя все предварительно заполнено информацией, основанной на id, мое поле древности пусто.
Это единственное, что мне не хватает в моей конфигурации, потому что django даже определяет, когда это поле пусто при отправке, и предотвращает любое обновление базы данных.
Я пытался сделать что-то вроде:
form.antiquity(instance=Employees.objects.get(pk=self.kwargs['pk']))
Но ошибка говорит о том, что объект "Enhanced_employeesForm" не имеет атрибута "древность".
1 ответ
Я делал это неправильно, мне пришлось добавить этот код в мою расширенную форму:
class Enhanced_employeesForm(employeesForm):
class Meta(employeesForm.Meta):
employeesForm.Meta.fields += ['antiquity']
и это сделало вещь.
если вам нужны виджеты, вы можете заметить, что все переопределено, чтобы предотвратить это, вам понадобится следующее:
employeesForm.Meta.widgets['antiquity'] = forms.DateInput(attrs={'class': 'form-control'})