Краткое резюме: как обеспечить правильный порядок значений в request.POST?
Я использую таблицу HTML (дополненную с помощью DataTables для скрытия столбцов и т. д., с единственным эффектом, заключающимся в том, что скрытые столбцы не включаются в вызов «отправить») и отображаю одну форму деформации для каждой строки.
Поскольку деформация не поддерживает раздельные формы напрямую с помощью атрибута формы, я вручную вставляю form=my_desired_unique_id
во все соответствующие элементы. Это отлично работает для простых элементов, таких как <input>
и <textarea>
, значения отображаются в request.POST.items()
и проходят проверку.
Однако для средства выбора даты деформации все немного сложнее. form['datecolumn'].serialize
будет генерировать что-то вроде этого: -
<input type="hidden" name="__start__" value="datecolumn:mapping"/>
<input type="date"
name="date"
value="2017-01-01"
id="deformField6" class=" form-control hasDatepicker"/>
<input type="hidden" name="__end__" value="datecolumn:mapping"/>
<script type="text/javascript">
deform.addCallback(
'deformField6',
function deform_cb(oid) {
if (!Modernizr.inputtypes['date'] ||"date" != "date" || window.forceDateTimePolyfill){
$('#' + oid).pickadate({"format": "yyyy-mm-dd", "selectMonths": true, "selectYears": true, "formatSubmit": "yyyy-mm-dd"});
}
}
);
</script>
Там есть 3 входа (и четвертый скрытый добавляется в отображаемый HTML с именем «date_submit»). Значение видимого ввода не изменяется, когда пользователь выбирает новую дату, но меняется новое скрытое значение. При отправке это значение каким-то образом передается на основной ввод «дата» (некоторые js, с которыми у меня нет дескриптора).
Результирующий request.POST.items()
содержит эти три элемента из ввода даты:
('__start__', 'datecolumn:mapping')
('date', '2017-02-24')
(это вновь выбранная дата)('__end__', 'datecolumn:mapping')
Моя проблема в том, что порядок этих значений ненадежен. На одной и той же странице и в форме многократное нажатие кнопки «Отправить» приведет к различному порядку значений в request.POST.items()
(все значения, а не только связанные с датой). Если результирующий порядок такой, как указано выше, все работает нормально, но если порядок другой (скажем, конец перед началом или дата после или до обоих), то я либо получаю ValueError, либо сбой проверки.
Возможно, я мог бы сначала перебрать request.POST.items()
и обеспечить правильное расположение, но мне нужны два средства выбора даты в этой форме, и у меня нет возможности узнать, какое поле date
принадлежит какой паре маркеров __start__
и __end__
.
Есть ли способ контролировать порядок элементов в POST до того, как он будет отправлен в мой код просмотра?