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
DateFieldrenderuję 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/16i wraca do kontrolera z
form.paid_date- to jest
DateField, to jest
20.09.2016i
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_datejak wyżej, czyli
DateFieldi
valuesą takie same. Jednak selektor daty pokazuje
mm/dd/rrrr. Więc jeśli wprowadzę
20.09.2016ręcznie lub z kolektorem i prześlę
form.paid_date.data
Nonezostanie 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!?
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
1 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Przeglądarka Chrome
to
['2011-01-01']
, więc nie pasuje do formatu czasu!powinieneś to zmienić w ten sposób: