2014-09-26 28 views
8

Bir DatePicker içeren bir şablon oluşturmaya çalışıyorum, ancak denediğimde 500 hata alıyorum. Benim kod için doğru, ama bir şey başarısız gibi görünüyor ya da bunu yapmak için doğru bir şekilde anlamadım.Flask, Flask-Admin ve WTforms ile DatePickerWidget

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) 

Raporlama şablonu::

kod şudur davidism yorumlarla söylediği gibi

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

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

Elde ettiğiniz istisna nedir? – dirn

+0

Tamam, "request.form" u kaldırdım çünkü bir istek değil. Şimdi doğru bir alanı gösterir, ancak tarihleri ​​seçmek için dateTimePicker yoktur. Sadece bir dize alanıdır. – Pepeluis

+0

DateField yalnızca tarih dizesi ayrıştırma sağlar. Ön uç seçicisini istiyorsanız, kendiniz eklemeniz gerekir. – davidism

cevap

17

, varsayılan DateField sadece tarih ayrıştırma sağlar, bunu Sadece normal bir metin girişi olarak görüntülenecek. tam destekleyen herhangi bir tarayıcıda bir datepicker hale getirecek o zaman wtforms.fields.html5 den DateField kullanabilirsiniz html5 kucaklamak hazırsanız

o:

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) 

daha olağan bir yaklaşım güzel bir datepicker bulmaktır çevrimiçi, CSS ve JS'yi kullanarak bu ekranı işlemek ve bu kodu html şablonunuza dahil etmek ve datepicker stilini datepicker sınıfına sahip herhangi bir html öğesine uygulamak gerektiğini söylemek. Formunuzu oluştururken Sonra tıpkı yapabilirsiniz: Varsayılan olarak sadece bir öznitelik olarak ekler form öğesi render içine geçmek (diğer kullanım için ayrılmış değildir)

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

Herhangi özelliklerini, örneğin {{ form.dt(class='datepicker') }}, <input class="datepicker" id="dt" name="dt" type="text" value=""> üretecektir, böylece CSS/JS'niz, kullanıcı için iyi bir arayüz sağlamak için ne gerekiyorsa onu yapabilir.

+0

Evet, işe yaradı. Widget'lar için aynı "görünümü ve hissi" takip etmiyor ama çalışıyor. Teşekkürler. – Pepeluis

+2

, "class _ = 'datepicker" olmalıdır – imwilsonxu