0

アプリ用に REST タイプの JSON API を構築しようとしています。テスト中に、ページの URL にアクセスすると不可解なエラーが発生し続けます。

URLconf:

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

ビュー.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 の結果をリストに変換しているので、fullCalendar で処理するためにリストを JSON として返す前に、さらに操作を実行できます (つまり、クエリで返されないレコードを挿入します)。

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
4

3 に答える 3

4

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 は、このビューが属するアプリの名前です。


参考までに:

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

pattern() の引数として、タプルの代わりに url() 関数を使用できます。これは、オプションの追加引数辞書なしで名前を指定する場合に便利です。例えば:

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

この関数は 5 つの引数を取り、そのほとんどはオプションです。

url(regex, view, kwargs=None, name=None, prefix='')
于 2012-05-30T03:25:29.607 に答える
1

完全なトレースバックを提供していただけますか?

これまでの問題:

  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'

于 2012-05-30T03:22:14.620 に答える
0

フィールドルックアップ構文を確認してください。kwargsをに渡す必要がありますfilter()。これは__lt、標準のPython比較演算子の代わりに型構文を使用することを意味します。

l = Lesson.objects.filter(student__teacher=request.user).filter(startDate__lte= thisMonth).filter(endDate__gte=thisMonthStart)
于 2012-05-30T02:43:07.987 に答える