Porównaj ceny domen i usług IT, sprzedawców z całego świata

Wtforms.fields.html5 DateField nie działa jak zwykły stary DateField w Flask


Mam problem ze znalezieniem Datepicker HTML5 w celu podania wartości do formularza w Flask przy użyciu formularzy WTF. Ten sam formularz działa zgodnie z oczekiwaniami, jeśli upuszczę DateField HTML5 na zwykły stary waniliowy DateField WTF.
Dla ciekawskich: Wersje: Python 3.5.2, Flask: 0.11.1, Flask-WTF: 0.12
Odpowiedni kod wyglądałby następująco:
Model:
class Order(db.Model):
__tablename__ = 'orders'
paid_date = db.Column(db.DateTime, nullable=True)

Kształt nie powinien mieć znaczenia, ale ze względu na kompletność, oto fragment z order-update.html:
<div class="form-group">
{{ form.paid_date.label }}
{% if form.paid_date.errors %}
{% for error in form.paid_date.errors %}
<p class="error-message">{{ error }} {% endfor %}
{% endif %}
{{ form.paid_date }}

Minimalny kontroler:
@app.route('/orders/update/<int:order_number>', methods=['GET', 'POST'])
def update_order(order_number):
order = Order.query.get(order_number)
if request.method == 'POST':
if not form.validate():
return render_template('update-order.html', form=form, order=order)
else:
form.populate_obj(order)
db.session.commit()
return redirect(url_for('user')
elif request.method == 'GET':
return render_template('update-order.html', form=form, order=order)

Oto, co działa w przypadku deklaracji formularza:
from flask_wtf import Form
from wtforms import DateFieldclass UpdateOrderForm(Form):
paid_date = DateField('Date Order Paid', format='%m/%d/%y',
render_kw={'placeholder': '6/20/15 for June 20, 2015'})
submit = SubmitField('Update Order')

podczas gdy następujące zepsują się:
from flask_wtf import Form
from wtforms.fields.html5 import DateFieldclass UpdateOrderForm(Form):
paid_date = DateField('Date Order Paid', format='%m/%d/%y',
render_kw={'placeholder': '6/20/15 for June 20, 2015'})
submit = SubmitField('Update Order')

Aby opisać to zachowanie, za pomocą prostego
DateField
renderuję formularz z ciągiem wejściowym (który również wyświetla bieżącą wartość, tak jak powinna po
form.populate_obj ()
, co pozwala wstawiam nową datę, np.
9/12/16
i wraca do kontrolera z
form.paid_date
- to jest
DateField
, to jest
20.09.2016
i
form.paid_date.data = 20.09.2016
. Jest to sprawdzane i zapisywane w bazie danych.
Kiedy przełączam się na selektor dat HTML5, co byłoby bardzo miłe, renderuję formularz z datownikiem (chciałbym ustawić go na bieżącą datę w obiekcie btw), który ma
form.paid_date
jak wyżej, czyli
DateField
i
value
są takie same. Jednak selektor daty pokazuje
mm/dd/rrrr
. Więc jeśli wprowadzę
20.09.2016
ręcznie lub z kolektorem i prześlę
form.paid_date.data
None
zostanie zwrócony. Co więcej, mam
process_errors = <class 'list'>: ['Not a valid date value']
raw_data = <class 'list'>: ['2016-09-20']
.
W ten sposób widzę, że dane są zwracane, ale nie są przetwarzane przez formularz i tym samym umieszczane w slocie danych. Mogę napisać kod, aby wyciągnąć go z
raw_data
, ale oczywiście brakuje mi czegoś, czy to jest błąd!?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dowiedziałem się o tym w

Przeglądarka Chrome
raw_data
to
['2011-01-01']
, więc nie pasuje do formatu czasu!
powinieneś to zmienić w ten sposób:
format='%Y-%m-%d',

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się