【问题标题】:Django Date formatting in forms query表单查询中的 Django 日期格式
【发布时间】:2012-02-14 18:12:54
【问题描述】:

您好,我有一个模型包含:

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

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

【问题讨论】:

  • 您的结果视图应该使用表单来验证 GET 数据。如果您从表单的已清理数据中获取 startdate 和 enddate,那么 Django 将负责转换为日期对象,并且您不会遇到任何日期格式问题。

标签: django forms date


【解决方案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()))

应该为你指明正确的方向。

【讨论】:

    【解决方案2】:

    我对错误消息有点困惑(即错误发生在哪里 - 当您进行查询时?)。

    但是,我使用它来将字符串从 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 ),
        #...
    

    尽管字符串来自路径而不是查询字符串,但应该没有区别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      相关资源
      最近更新 更多