1

これが事です。私の urls.py :

urlpatterns = patterns('snippets.views',
                       url(r'^snippets/$', 'snippet_list'),
                       url(r'^snippets/(?P<pk>[0-9]+)/$', 'snippet_detail'),
                       )

私のviews.py:

class JSONResponse(HttpResponse):

    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)

    @csrf_exempt
    def snippet_list(request):
        if request.method == 'GET':
            snippets = Snippet.objects.all()
            serializer = SnippetSerializer(snippets, many=True)
            return JSONResponse(serializer.data)

        elif request.method == 'POST':
            data = JSONParser().parse(request)
            serializer = SnippetSerializer(data=data)
            if serializer.is_valid():
                serializer.save()
                return JSONResponse(serializer.data, status=201)
            else:
                return JSONResponse(serializer.errors, status=400)

私はこのチュートリアルに従っています。

local/snippets/ にいるときにこのエラーが発生します:

/snippets/ の ViewDoesNotExist snippets.views.snippet_list をインポートできませんでした。ビューがモジュール snippets.views に存在しません。

更新:これを解決した後に私が持っているErrorKey:

KeyError at /snippets/
'id'

Environment:

Request Method: GET
Request URL: http://localhost:8000/snippets/

Django Version: 1.5.1
Python Version: 2.7.4
Installed Applications:
('django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'snippets')
Installed Middleware:
('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 "/home/thomas/.virtualenvs/REST/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  115.                         response = callback(request, *callback_args, **callback_kwargs)
File "/home/thomas/.virtualenvs/REST/local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  77.         return view_func(*args, **kwargs)
File "/home/thomas/projets/rest/snippets/views.py" in snippet_list
  21.         serializer = SnippetSerializer(snippets, many=True)
File "/home/thomas/.virtualenvs/REST/local/lib/python2.7/site-packages/rest_framework/serializers.py" in __init__
  159.         self.fields = self.get_fields()
File "/home/thomas/.virtualenvs/REST/local/lib/python2.7/site-packages/rest_framework/serializers.py" in get_fields
  206.                 new[key] = ret[key]

Exception Type: KeyError at /snippets/
Exception Value: 'id'

SnippetSerializer クラスの更新:

class SnippetSerializer(serializers.Serializer):

    class Meta:
        model = Snippet
        fields = ('id', 'title', 'code', 'linenos', 'language', 'style')

    def restore_object(self, attrs, instance=None):
        """
        Create or update a new snippet instance, given a dictionnary
        or deserialized field values

        Note that if we don't define this method, then deserializing
        data will simply return a dictionnary of items.
        """

        if instance:
            instance.title = attrs.get('title', instance.title)
            instance.code = attrs.get('code', instance.code)
            instance.linenos = attrs.get('linenos', instance.linenos)
            instance.language = attrs.get('language', instance.language)
            instance.style = attrs.get('style', instance.style)
            return instance

        return Snippet(**attrs)
4

2 に答える 2

8

次のように変更views.pyします。

class JSONResponse(HttpResponse):

    def __init__(self, data, **kwargs):
        content = JSONRenderer().render(data)
        kwargs['content_type'] = 'application/json'
        super(JSONResponse, self).__init__(content, **kwargs)

@csrf_exempt
def snippet_list(request, pk=None):
    if request.method == 'GET':
        snippets = Snippet.objects.all()
        serializer = SnippetSerializer(snippets, many=True)
        return JSONResponse(serializer.data)

    elif request.method == 'POST':
        data = JSONParser().parse(request)
        serializer = SnippetSerializer(data=data)
        if serializer.is_valid():
            serializer.save()
            return JSONResponse(serializer.data, status=201)
        else:
            return JSONResponse(serializer.errors, status=400)

pkまた、ビューが正常に機能するには、ビューへのパラメーターとして必要です。

class SnippetSerializer(serializers.Serializer):に変更する必要がありますclass SnippetSerializer(serializers.ModelSerializer):

于 2013-05-24T13:37:03.070 に答える
2

ブロックをインデント解除するdef snippet_list(request):と、よりうまく機能します。

あなたの要求は、モジュールのグローバル スコープにありません。だから見つからない。

于 2013-05-24T13:32:26.943 に答える