DatePickerWidget с Flask, Flask-Admin и WTforms

Я пытаюсь визуализировать шаблон, содержащий DatePicker, но при попытке получаю ошибку 500. На мой взгляд, код правильный, но кажется, что что-то не так или я неправильно понимаю, как это сделать.

Код следующий:

Reporting.py

from flask.ext.admin import BaseView, expose
from wtforms import DateField, Form
from wtforms.validators import Required
from flask.ext.admin.form import widgets
from flask import request

class DateRangeForm(Form):
    start_date = DateField('Start', validators=[Required()], format = '%d/%m/%Y', description = 'Time that the event will occur', widget=widgets.DatePickerWidget)

class ReportingView(BaseView):
    @expose('/')
    def index(self):
        form = DateRangeForm(request.form)
        return self.render('reporting.j2', form=form)

Шаблон отчета:

{% extends 'admin/master.html' %}
{% block body %}
    {{super()}}
    Working on it!

    {% if form %}
        {{form.start_date}}
    {% endif %}
{% endblock %}

person Pepeluis    schedule 26.09.2014    source источник
comment
Какое исключение вы получаете?   -  person dirn    schedule 26.09.2014
comment
Хорошо, я удалил request.form, потому что это не запрос. Теперь поле показывает правильно, но нет dateTimePicker для выбора дат. Это только строковое поле.   -  person Pepeluis    schedule 26.09.2014


Ответы (1)


Как говорится в комментариях давидизма, DateField по умолчанию просто обеспечивает синтаксический анализ даты, он просто будет отображаться как обычный текстовый ввод.

Если вы готовы полностью принять html5, вы можете использовать DateField из wtforms.fields.html5, который будет отображать датупикер в любом браузере, который его поддерживает:

from flask import Flask, render_template
from flask_wtf import Form
from wtforms.fields.html5 import DateField
app = Flask(__name__)
app.secret_key = 'SHH!'


class ExampleForm(Form):
    dt = DateField('DatePicker', format='%Y-%m-%d')


@app.route('/', methods=['POST','GET'])
def hello_world():
    form = ExampleForm()
    if form.validate_on_submit():
        return form.dt.data.strftime('%Y-%m-%d')
    return render_template('example.html', form=form)


if __name__ == '__main__':
    app.run(debug=True)

Более обычный подход состоит в том, чтобы найти в Интернете приятный datepicker, который использует CSS и JS для обработки его отображения и включает этот код в ваш html-шаблон, а также указывает ему применять стиль datepicker к любому элементу html, имеющему класс datepicker. Затем, когда вы сгенерируете свою форму, вы можете просто сделать:

<!-- all your CSS and JS code, including the stuff -->
<!-- to handle the datepicker formatting -->

<form action="#" method="post">
    {{ form.dt(class='datepicker') }}
    {{ form.hidden_tag() }}
    <input type="submit"/>
</form>

Любые атрибуты (которые не зарезервированы для другого использования), которые вы передаете для рендеринга элемента формы, по умолчанию просто добавят его как атрибут, например, {{ form.dt(class='datepicker') }} сгенерирует <input class="datepicker" id="dt" name="dt" type="text" value="">, чтобы ваш CSS / JS мог делать все, что ему нужно, для предоставить хороший интерфейс для вашего пользователя.

person Doobeh    schedule 27.09.2014
comment
Да, это сработало. Внешний вид виджетов отличается от внешнего вида, но работает. Спасибо. - person Pepeluis; 29.09.2014
comment
должно быть class_='datepicker' - person imwilsonxu; 29.04.2016