Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

DatePickerWidget with Flask, Flask-Admin and WTforms

Tags:

I'm trying to render a template that contains a DatePicker, but I'm getting a 500 error when I try. For my the code is correct, but it seems that something is failing or I'm not understanding correctly the way to do it.

The code is the following:

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) 

Reporting template:

{% extends 'admin/master.html' %} {% block body %}     {{super()}}     Working on it!      {% if form %}         {{form.start_date}}     {% endif %} {% endblock %} 
like image 405
Pepeluis Avatar asked Sep 26 '14 10:09

Pepeluis


1 Answers

As davidism says in the comments, the default DateField just provides date parsing, it'll just be displayed as a normal text-input.

If you're ready to fully embrace html5 then you can use the DateField from wtforms.fields.html5 which will render a datepicker in any browser that supports it:

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) 

The more usual approach is to find a nice datepicker online, that's using CSS and JS to handle it's display and include that code into your html template, and tell it to apply the datepicker style to any html element that has a class of datepicker. Then when you generate your form you can just do:

<!-- 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> 

Any attributes (that aren't reserved for other use) you pass into rendering the form element will by default just add it as an attribute, for example the {{ form.dt(class='datepicker') }} will generate <input class="datepicker" id="dt" name="dt" type="text" value=""> so your CSS/JS can then do whatever it needs to do to provide a good interface for your user.

like image 117
Doobeh Avatar answered Oct 30 '22 17:10

Doobeh