Пользовательская форма Django - clean_data имеет неверные значения для IntegerField

В моем приложении Django (версия 3.1) я добавил пользовательскую форму для запуска экспорта данных, которая, помимо прочего, может собирать два целочисленных значения, представляющих годы в диапазоне дат. Когда форма отправляется, независимо от того, какие значения пользователь установил в числовых полях, значения, которые появляются в атрибуте cleaned_data формы, являются значениями, которые были установлены как initial для этих полей в определении класса формы.

Например, начальное значение поля должно быть 2022 - но какое бы значение пользователь ни установил в поле ввода, значение в form.cleaned_data для поля будет 2022.

A ChoiceField в форме работает как ожидалось, и я довольно неопытен в Django - поэтому я не могу понять, что я сделал не так. Вот немного упрощенная версия кода...

observation/forms.py:

from django import forms
import datetime

export_formats = [
    'csv',
    'xls',
    'xlsx',
]
export_format_choices = [(f, f) for f in export_formats]
min_year = 1950

class ExportForm(forms.Form):
    current_year = datetime.datetime.now().year

    export_format = forms.ChoiceField(required=True, label='Format', choices=export_format_choices)
    year_from = forms.IntegerField(required=False, disabled=True, min_value=min_year, max_value=current_year, initial=current_year)
    year_through = forms.IntegerField(required=False, disabled=True, min_value=min_year, max_value=current_year, initial=current_year)

    def __init__(self, *args, **kwargs):
        super(ExportForm, self).__init__(*args)

admin.py

def export_view(self, request):
    if request.method == 'POST':
        form = ExportForm(request.POST)

        if form.is_valid():
            export_format = form.cleaned_data['export_format']
            data_scope = 'all'
            year_range = ''

            year_range = f'_{form.cleaned_data["year_from"]}-{form.cleaned_data["year_through"]}'
            query_params &= Q(created_at__year__gte=form.cleaned_data['year_from'])
            query_params &= Q(created_at__year__lte=form.cleaned_data['year_through'])

            query = Observation.objects.filter(query_params).select_related('items')
            dataset = ObservationResource().export(query)
            response = HttpResponse(getattr(dataset, export_format), content_type=export_format)
            response['Content-Disposition'] = f'attachment; filename="items_data_{data_scope}{year_range}.{export_format}"'

            return response

    return TemplateResponse(request, 'export.html')

Итак, строка form.cleaned_data['export_format'] в admin.py установлена на правильное значение - и если я рассмотрю form.POST, то увижу, что установлены правильные значения для year_from и year_through (в данном случае 2019 и 2020) -

<QueryDict: {'csrfmiddlewaretoken': ['...'], 'year_from': ['2019'], 'year_through': ['2020'], 'export_format': ['csv']}>

но cleaned_data появляется как

{'export_format': 'csv', 'year_from': 2022, 'year_through': 2022}

Почему cleaned_data для этих IntegerField не отражает данные в form.POST? Большое спасибо.

В определении формы у вас есть

year_from = forms.IntegerField(required=False, disabled=True,

Из docs

Аргумент disabled boolean, когда он установлен в True, отключает поле формы используя HTML-атрибут disabled, так что оно не будет редактироваться пользователи. Даже если пользователь изменит значение поля, переданное на сервер, оно будет проигнорировано. серверу, оно будет проигнорировано в пользу значения из формы начальных данных.

Если вы хотите, чтобы пользователи могли редактировать значение, удалите этот атрибут.

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