【问题标题】:TypeError: 'str' object is not callable (Django/Python)TypeError:“str”对象不可调用(Django/Python)
【发布时间】:2012-06-04 06:32:12
【问题描述】:

我正在尝试为我的应用程序构建一个 REST 类型的 JSON API,并且在我测试它时,当我点击我的页面的 URL 时,我不断收到一个神秘的错误。

URLconf:

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:这是导致我使用此实现的original question

追溯:

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

【问题讨论】:

  • 你能添加你得到的错误吗?
  • 请求方法:GET 请求 URL:alpha:5678/calendar/1/2012/5 Django 版本:1.3.1 异常类型:TypeError 异常值:'str' 对象不可调用
  • 在您的 URLConf 中,它应该是 'views.calender_resource'(并且可能以应用名称为前缀),而不仅仅是 'calender_resource'

标签: python django fullcalendar


【解决方案1】:

在您的 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'),
)

或者:

urlpatterns = patterns('APP_NAME.views',

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

其中 APP_NAME 是该视图所属应用的名称。


对于reference

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='')

【讨论】:

    【解决方案2】:

    能否提供完整的追溯信息?

    目前的问题:

    1. 您不能直接在模型实例列表上json.dumps。如果你想要这样的转储,请查看django.core.serializers

      from django.core.serializers.json import Serializer
      Serializer().serialize(Lesson.objects.filter(...))
      
    2. 'application/json' 是 json 的标准 mime 类型,而不是 'text/json'

    【讨论】:

    • 谢谢,我添加了更多信息,包括完整的回溯和原始 SO 问题的链接,这些问题影响了我尝试这个特定的实现。
    【解决方案3】:

    检查field lookup syntax。您需要将 kwargs 传递给 filter()。这意味着使用__lt 类型语法而不是标准的python 比较运算符。

    l = Lesson.objects.filter(student__teacher=request.user).filter(startDate__lte= thisMonth).filter(endDate__gte=thisMonthStart)
    

    【讨论】:

    • 好收获。将我的过滤器更改为Lesson.objects.filter(student__teacher = request.user).filter(startDate__lte=thisMonthEnd).filter(endDate__gte=thisMonthStart),但仍然没有运气。同样的错误。
    猜你喜欢
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多