Метод 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.