Метод django form clean_<имя поля>

Я просмотрел похожие ответы, но был удивлен, что в этом списке нет ничего, затрагивающего такой основной вопрос.

Моя форма Django выглядит следующим образом:

class JobApplicationForm(forms.Form):
    message = forms.CharField(widget=forms.Textarea)
    documents = forms.FileField(label="Documents", widget=DocumentUploadWidget)

    def clean(self):
        super().clean()

    def clean_documents(self):
        print ("clean_documents")
        return self.cleaned_data['clean_documents']

Я не могу найти, как заставить вызываться функцию clean_documents(). В документации говорится, что нужно использовать метод form.is_valid(), но у меня он не работает. Вот мой пример сеанса оболочки Django:

Python 3.7.5 (default, Feb 23 2021, 13:22:40) 
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from home.forms import JobApplicationForm
>>> f = JobApplicationForm({'message':'sdfsfsdfs'})
>>> f.is_bound
True
>>> f.is_valid()
False
>>> f.errors
{'documents': ['This field is required.']}
>>> 

Ни на одном этапе я не увидел результата оператора печати в методе clean_documents(). Что еще должно произойти, чтобы его увидеть?

Если в вашей форме есть загруженные файлы, вам нужно передать их в качестве второго параметра в конструктор формы. Поскольку вы этого не сделали, форма не может найти поле documents, поэтому она не вызывает clean_documents().

Обычно вы загружаете форму из запроса в функции просмотра следующим образом:

def some_view(request):
    form = JobApplicationForm(request.POST, request.FILES)

В этом примере вместо запроса используется SimpleUploadedFile, поэтому вы можете запустить его в оболочке Python:

from home.forms import JobApplicationForm
from django.core.files.uploadedfile import SimpleUploadedFile
f = JobApplicationForm(
        {'message': 'blah'},
        {'documents': SimpleUploadedFile('test.txt', b'contents')})
f.is_valid()

Последняя строка печатает clean_documents.

Вернуться на верх