2014-09-26 8 views
8

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

код выглядит следующим образом:

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 %} 
+0

Какое исключение вы получаете? – dirn

+0

ОК, я удалил «request.form», потому что это не запрос. Теперь он правильно показывает поле, но нет даты datePimeer для выбора дат. Является только строковым полем. – Pepeluis

+0

DateField просто предоставляет синтаксический анализ строк. Если вам нужен какой-то передний финишер, вам нужно добавить его самостоятельно. – davidism

ответ

17

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

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

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 мог делать все, что ему нужно, чтобы обеспечить хороший интерфейс для вашего пользователя.

+0

Да, это сработало. Не следит за тем же «внешним видом» виджетов, но работает. Благодарю. – Pepeluis

+2

должен быть 'class _ = 'datepicker'' – imwilsonxu

 Смежные вопросы

  • Нет связанных вопросов^_^