Django表单查询中的日期格式

时间:2012-02-14 18:12:54

标签: django forms date

您好我有一个包含以下内容的模型:

class MyModel(models.Model):
    id = models.IntegerField(primary_key=True)
    recorded_on = models.DateField()
    precipitation = models.FloatField(null=True, blank=True)

我有一个看起来像这样的表格:

class QueryForm(forms.Form):
    precipitation = forms.BooleanField(label=ugettext_lazy('Precipitation'),)   
    startdate = forms.DateField(widget = widgets.AdminDateWidget, label=ugettext_lazy('Start Date'),)
    enddate = forms.DateField(widget = widgets.AdminDateWidget, label=ugettext_lazy('End Date'),)

在我的views.py中,我有一个表单视图和一个单独的视图,用于通过GET收集数据。这是第二个view.py的非常简化的版本:

def results(request):
    if 'q' in request.GET:
    ...
    startdate = request.GET.get('startdate', None)
    enddate = request.GET.get('enddate', None)
    data = MyModel.objects.filter(recorded_on__range = (startdate, enddate))
    ...

我在GET中的日期变量格式为' YYYY-MM-DD'。

问题是查询引发了这个错误:

coercing to Unicode: need string or buffer, datetime.date found

处理查询的日期格式的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

我对错误消息感到有点困惑(例如,当您进行查询时,错误发生在哪里?)。

但是,我使用它将字符串从url参数转换为datetime.date:

def things_by_appointment(request, appointment_date):
    '''
    Things with appointment date yyyy-mm-dd
    '''
    try:
        as_date = datetime.datetime.strptime( appointment_date, '%Y-%m-%d').date
    except ValueError:
        return HttpResponseBadRequest('%s is not a correct date' % appointment_date )


    things = Thing.objects.filter(
                              Q( appointment_date = as_date ),
    #...

虽然字符串来自路径而不是查询字符串,但它不应该有所作为。

答案 1 :(得分:1)

您需要从表单数据中创建Date对象,该表单数据当前是一个字符串。你得到的错误来自django试图将这些字符串与模型上的日期进行比较。

这样:

from datetime import datetime

format = '%d-%m-%Y' # Or whatever your date format is
st = datetime.strptime(startdate, format)
ed = datetime.strptime(enddate, format)

data = MyModel.objects.filter(recorded_on__range=(st.date(), ed.date()))

应该指出正确的方向。