Добавление дополнительного поля в forms.ModelForm
Я пытаюсь создать modelForm в django, однако когда я пытаюсь добавить дополнительное поле, я получаю ошибку поля:
django.core.exceptions.FieldError: Unknown field(s) (select_file_path) specified for ProjectFile
Моя форма выглядит следующим образом:
class ProjectFileForm(forms.ModelForm):
select_file_path = forms.Select()
class Meta:
model = ProjectFile
fields = ["project", "form_type", "select_file_path", "file_name", "full_file_path", "author"]
widgets = {"author": HiddenInput()}
field_order = ["project", "form_type", "select_file_path", "file_name", "full_file_path"]
Не очень понимаю, что здесь не так, поскольку модель формы определяется таким же образом в документации: https://docs.djangoproject.com/en/4.1/topics/forms/modelforms/#overriding-the-default-fields
Вы можете просто вручную отобразить <input>
внутри <form>
в шаблоне. Он будет автоматически отправлен с обычными данными формы, а затем вы обработаете их в представлении (это простой способ, но без дополнительных шаблонов)
.
Я могу написать небольшой пример, если вам нужен этот способ, только дайте мне знать, используете ли вы представления на основе классов или обычные (если на основе классов, дайте мне какой-нибудь пример кода, потому что я не использую представления на основе классов
Вы не можете поместить поля не из модели внутрь формы.ModelForm.
- вы просто не можете поместить его в МЕТА (кто бы мог подумать)
Вы можете сделать form.Form, но вам придется обрабатывать сохранение + валидацию уникальных полей
class customForm(forms.Form):
desc = forms.CharField()
color = forms.CharField()
def __init__(self, *args, **kwargs):
self.instance = kwargs.pop('instance') if 'instance' in kwargs else None
super(customForm, self).__init__(*args, **kwargs)
self.fields['desc'].widget.attrs={'maxlength': '200'}
self.fields['color'].widget.attrs={'maxlength': '50'}
def is_valid(self):
valid = super(customForm, self).is_valid()
if self.cleaned_data.get('desc') == 'Nealium is Dumb':
self.add_error('desc', 'Slander is not Allowed')
valid = False
return valid
def save(self):
if self.obj:
# exists / update
self.instance.desc = self.cleaned_data.get('desc')
self.instance.save()
else:
# new / create
mymodel.create(desc=self.cleaned_data.get('desc'))
# dothing something with color
self.cleaned_data.get('desc')
Удалите select_file_path
из полей мета-класса, так как только поля модели могут быть включены в этот атрибут,
Как упоминал @Ian, поле forms.Select() является виджетом и не может быть изменено внутри шаблона таким образом, в данном конкретном случае просто измените
select_file_path = forms.select()
В поле формы, а не виджета, например
select_file_path = forms.ChoiceField()