Итак, я пытаюсь создать форму в Django с помощью FileField.
Мой forms.py выглядит так:

from django import forms

class WordcloudForm(forms.Form):
    matrix = forms.FileField(required=True)
    min = forms.IntegerField(required=False)
    max = forms.IntegerField(required=False)
    # mask = forms.FileField(required=False)

Я хочу, чтобы FileField было обязательным полем.
views.py:

def form(request):
    if request.method == 'POST':
        form = WordcloudForm(request.POST)
        print(form.is_valid)
        if form.is_valid():
            if 'matrix' in request.FILES:
                uploaded_matrix = request.FILES['matrix']
                print(uploaded_matrix.name, uploaded_matrix.size)
        min = form.cleaned_data['min']
        max = form.cleaned_data['max']
        print('min',min,'max',max)
        print(form.errors)

Когда forms.FileField(required = True) в forms.py, form.is_valid () возвращает false:
required = True

Когда forms.FileField(required=False) в forms.py, form.is_valid () возвращает true:
required = False
Когда я отправляю форму с forms.FileField(required = True), мой print(form.errors) сообщает: "Это поле обязательно", хотя я добавляю файл.

Я пробовал разные форматы файлов, чтобы убедиться, что проблема возникла не только с изображением, которое я использовал для тестирования.
Что мне не хватает?

0
Benjamin Josso 2 Дек 2020 в 13:35

1 ответ

Лучший ответ

Как указано в документации вам необходимо передать request.FILES вместе с request.POST при запуске экземпляра формы:

if request.method == 'POST':
    form = WordCloudForm(request.POST, request.FILES)
    if form.is_valid():
        # rest of the code

Также переименуйте свой метод просмотра с form во что-нибудь значимое, потому что у вас есть переменная с именем form внутри метода. То же самое с именами переменных min и max, они конфликтуют с функциями python min и max. Ваша IDE уже отмечает их.

2
ruddra 2 Дек 2020 в 10:41