Привет. Итак, я уже довольно давно использую WTForms с успехом.
Проблема в том, как разбирать даты.
Я всегда назначал переменные в соответствии с данными формы следующим образом
firstname = form.firstname.data
Это сохранит ввод пользователя из данных формы в мою переменную с именем «firstname», которая отлично работает, моя проблема - когда дело доходит до дат.
У меня есть следующий код
Класс WTForms
class BookingForm(Form):
start_date = DateField('Start Date', format='%m/%d/%Y')
end_date = DateField('End Date', format='%m/%d/%Y')
Маршрут бронирования
@app.route('/book/', methods=['GET','POST'])
@login_required
def book():
try:
form = BookingForm(request.form)
if request.method == "POST" and form.validate():
start_date = form.start_date.data
end_date = form.end_date.data
# I Have also tried form.start_date.data.strftime('%m-%d-%Y') with no luck
...
Шаблон HTML {jinja}
<div class = "col-md-4">
{{ render_date_field(form.start_date) }}
</div>
<div class = "col-md-4">
{{ render_date_field(form.end_date) }}
</div>
Я также использую datetime в python
from datetime import datetime
Я безуспешно пытался следовать многим документам о том, как преобразовать дату в переменную из формы ввода пользователя, кто-нибудь знает правильный синтаксис?
Спасибо






form.date_created.data возвращает объект datetime.date.
Атрибуты month, day и year хранят эти значения как целые числа. Для решения этой проблемы нет необходимости импортировать datetime.
Вы можете использовать date.strftime('%m-%d-%y') для получения строкового представления, такого как "10-22-18".
form = BookingForm(request.form)
if request.method == "POST" and form.validate():
start_date = form.start_date.data
end_date = form.end_date.data
# print(type(start_date)) -> <class 'datetime.date'>
start_month = start_date.month
start_day = start_date.day
start_year = start_date.year
start_date_str = start_date.strftime('%m-%d-%y')
# and so on...
Взгляните на Документация WTForms для DateField.
class wtforms.fields.DateField(default field arguments, format='%Y-%m-%d')
Same as DateTimeField, except stores a datetime.date.
Вы можете узнать больше об объекте date в документации.
Документы Python
Кончик: если бы вы попробовали print(type(start_date)), чтобы посмотреть, что он печатает, вы, вероятно, разобрались бы сами.
Я пробовал использовать «print (type (start_date))», но я получаю None взамен, и очевидно, что ошибка flask: «должен быть строковым или доступным только для чтения буфером, а не None» Спасибо за вашу помощь
Если state_date - это None, то похоже, что вы не получаете данные формы для начала. Разбор не ваша проблема. Вы можете сделать две вещи: (1) Попробуйте использовать что-то вроде PDB или flask-debugtoolber, чтобы выяснить, где что-то пошло не так. (2) Еще одно место для проверки - инструменты разработчика вашего браузера на вкладке Сеть, чтобы увидеть, что запрос POST выполняется с ожидаемыми параметрами запроса.
Хорошо, обнаружил, что у меня была опечатка, и я исправил ее ... спасибо за вашу помощь, в другом примечании, вы рекомендуете использовать средство выбора даты и времени html для хранения дат в базе данных или просто текстовое поле со слоем jquery наверху?
Указанный формат даты должен применяться при заполнении формы в браузере. Ваш формат даты - % m /% d /% Y. Пример даты начала в этом формате: 06.10.2018.
wtfанализирует это как 2018-10-06 и сохраняет вform.start_date.data.