Django Форматирование даты в запросе форм - PullRequest
0 голосов
/ 14 февраля 2012

Привет, у меня есть модель, содержащая:

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 имеют формат «ГГГГ-ММ-ДД».

Проблема в том, что запрос вызывает эту ошибку:

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

Как лучше всего обращаться с моим форматом даты, чтобы сделать запрос?

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Вам потребуется создать объекты 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()))

Должно указывать вам правильное направление.

1 голос
/ 14 февраля 2012

Я немного озадачен сообщением об ошибке (т. Е. Где возникает ошибка - когда вы делаете запрос?).

Однако я использовал это для преобразования строки из параметра 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 ),
    #...

Несмотря на то, что строка взята из пути, а не из строки запроса, она не должна иметь значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...