DatePickerWidget avec Flask, Flask-Admin et WTforms

j'essaie de rendre un modèle qui contient un curseur de données, mais j'obtiens une erreur de 500 quand j'essaie. Pour moi, le code est correct, mais il semble que quelque chose échoue ou Je ne comprends pas correctement la façon de le faire.

Le code est le suivant:

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)

modèle de rapport:

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

    {% if form %}
        {{form.start_date}}
    {% endif %}
{% endblock %}
9
demandé sur Pepeluis 2014-09-26 14:43:01

1 réponses

comme le dit davidism dans les commentaires, le champ de données par défaut ne fournit que le parsing de la date, il sera simplement affiché comme une entrée de texte normale.

si vous êtes prêt à embrasser pleinement html5 alors vous pouvez utiliser le champ de données de wtforms.fields.html5 qui va rendre un lecteur de données dans n'importe quel navigateur qui le supporte:

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)

l'approche la plus habituelle est de trouver un bon lecteur de données en ligne, qui utilise CSS et JS pour gérer son affichage et inclure ce code dans votre modèle html, et dire pour appliquer le datepicker de style à n'importe quel élément html qui a une classe de datepicker. Ensuite, lorsque vous générez votre formulaire, vous pouvez simplement faire:

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

tous les attributs (qui ne sont pas réservés à une autre utilisation) que vous passez dans le rendu de l'élément de forme sera par défaut juste l'ajouter comme un attribut, par exemple le {{ form.dt(class='datepicker') }} va générer <input class="datepicker" id="dt" name="dt" type="text" value=""> donc votre CSS / JS peut alors faire tout ce qu'il doit faire pour fournir une bonne interface à votre utilisateur.

18
répondu Doobeh 2014-09-27 01:13:44