Добавление дополнительного поля в 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()
Вернуться на верх