Пользовательская форма 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, так что оно не будет редактироваться пользователи. Даже если пользователь изменит значение поля, переданное на сервер, оно будет проигнорировано. серверу, оно будет проигнорировано в пользу значения из формы начальных данных.
Если вы хотите, чтобы пользователи могли редактировать значение, удалите этот атрибут.