TypeError: объект 'str' не вызывается (Django/Python)

Я пытаюсь создать JSON API типа REST для своего приложения, и пока я его тестирую, я продолжаю получать загадочную ошибку, когда нажимаю URL-адрес своей страницы.

Конфигурация URL:

url(r'^calendar/(?P<id>\d+)/(?P<year>\d+)/(?P<month>\d+)/$', 'calendar_resource'),

views.py:

def json_view(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return HttpResponse(json.dumps(result), mimetype="text/json")
    return wrapper    

@json_view
def calendar_resource(request, id, month, year):
    if id != request.user.id:
        return HttpResponseForbidden()
    thisMonthEnd = datetime.datetime(year, month, calendar.mdays[month])
    thisMonthStart = datetime.datetime(year, month, 1)
    l = Lesson.objects.filter(student__teacher = request.user).filter(startDate__lte=thisMonthEnd).filter(endDate__gte=thisMonthSta‌​rt)
    lessonList = list(l)
    return lessonList

Я преобразовываю результат QuerySet в список, чтобы я мог выполнять с ним дополнительные операции (т. е. вставлять записи, которые не будут возвращены в запросе), прежде чем передать список обратно в виде JSON для обработки с помощью fullCalendar.

ETA: это исходный вопрос, который привел меня к использованию этой реализации. .

Отслеживание:

Environment:
Request Method: GET
Request URL: http://localhost:5678/calendar/1/2012/5/

Django Version: 1.3.1
Python Version: 2.6.5
Installed Applications:
['django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.humanize',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.admin',
 'lessons',
 'registration']
Installed Middleware:
('django.middleware.csrf.CsrfViewMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware')


Traceback:
File "/usr/local/lib/python2.6/dist-packages/django/core/handlers/base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)

Exception Type: TypeError at /calendar/1/2012/5/
Exception Value: 'str' object is not callable

person Matthew Calabresi    schedule 30.05.2012    source источник
comment
Вы можете добавить ошибку, которую вы получаете?   -  person marianobianchi    schedule 30.05.2012
comment
Метод запроса: URL запроса GET: alpha:5678/calendar/1/2012/5 Версия Django: 1.3.1 Тип исключения: TypeError Значение исключения: объект 'str' не вызывается   -  person Matthew Calabresi    schedule 30.05.2012
comment
В вашем URLConf это должно быть 'views.calender_resource' (и, возможно, с префиксом имени приложения), а не просто 'calender_resource'   -  person K Z    schedule 30.05.2012


Ответы (3)


В вашей URLConf это должно быть 'views.calender_resource', а не просто 'calender_resource'.

По сути,

urlpatterns = patterns('',

    url(r'^calendar/(?P<id>\d+)/(?P<year>\d+)/(?P<month>\d+)/$', 'APP_NAME.views.calendar_resource'),
)

Or:

urlpatterns = patterns('APP_NAME.views',

    url(r'^calendar/(?P<id>\d+)/(?P<year>\d+)/(?P<month>\d+)/$', 'calendar_resource'),
)

где APP_NAME — это название приложения, которому принадлежит это представление.


Для справки:

url(regex, view, kwargs=None, name=None, prefix='')

Вы можете использовать функцию url() вместо кортежа в качестве аргумента Patterns(). Это удобно, если вы хотите указать имя без дополнительного словаря дополнительных аргументов. Например:

urlpatterns = patterns('',
    url(r'^index/$', index_view, name="main-view"),
    ...
)

Эта функция принимает пять аргументов, большинство из которых являются необязательными:

url(regex, view, kwargs=None, name=None, prefix='')
person K Z    schedule 30.05.2012

Не могли бы вы предоставить полную трассировку?

Проблемы до сих пор:

  1. Вы не можете json.dumps в списке экземпляров модели напрямую. Если вам нужен такой дамп, посмотрите на django.core.serializers

    from django.core.serializers.json import Serializer
    Serializer().serialize(Lesson.objects.filter(...))
    
  2. 'application/json' — стандартный тип mime для json вместо 'text/json'

person okm    schedule 30.05.2012
comment
Спасибо, я добавил больше информации, включая полную трассировку и ссылку на исходный вопрос SO, который побудил меня попробовать эту конкретную реализацию. - person Matthew Calabresi; 30.05.2012

Проверьте синтаксис поиска полей. Вам нужно передать kwargs filter(). Это означает использование синтаксиса типа __lt вместо стандартных операторов сравнения Python.

l = Lesson.objects.filter(student__teacher=request.user).filter(startDate__lte= thisMonth).filter(endDate__gte=thisMonthStart)
person Damien Ayers    schedule 30.05.2012
comment
Хороший улов. Изменил фильтр на Lesson.objects.filter(student__teacher = request.user).filter(startDate__lte=thisMonthEnd).filter(endDate__gte=thisMonthStart), но все равно не повезло. Та же ошибка. - person Matthew Calabresi; 30.05.2012