首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未定义名称‘snippet’[Django Rest]

未定义名称‘snippet’[Django Rest]
EN

Stack Overflow用户
提问于 2014-07-07 20:22:10
回答 3查看 5K关注 0票数 1

我正在学习Django REST Framework的教程,当我尝试卷曲http://127.0.0.1:8000/snippets时,我得到了这个错误。我是Python/the Framework和Django的新手,所以我不知道该去哪里看。

代码似乎很好,因为我已经在github上仔细检查过了。你认为错误应该在哪里?

Snippet/serializers.py

代码语言:javascript
复制
    from rest_framework import serializers
    from snippets.models import Snippet

    class SnippetSerializer(serializers.Serializer):
        class Meta:
            model = Snippet
            fields = ('id', 'title','code','linenos','language','style')
class SnippetSerializer(serializers.Serializer):
    pk = serializers.Field()  # Note: `Field` is an untyped read-only field.
    title = serializers.CharField(required=False,
                                  max_length=100)
    code = serializers.CharField(widget=widgets.Textarea,
                                 max_length=100000)
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES,
                                       default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES,
                                    default='friendly')
def restore_object(self, attrs, instance=None):
        """
        Create or update a new snippet instance, given a dictionary
        of deserialized field values.

        Note that if we don't define this method, then deserializing
        data will simply return a dictionary of items.
        """
        if instance:
            # Update existing 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

        # Create new instance
        return Snippet(**attrs)

snippet/urls.py

代码语言:javascript
复制
from django.conf.urls import patterns, url

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

snippet/views.py

代码语言:javascript
复制
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from snippets.models import Snippet
from snippets.serializers import SnippetSerializer

class JSONResponse(HttpResponse):
    """
    An HttpResponse that renders its content into JSON.
    """
    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):
    """
    List all code snippets, or create a new snippet.
    """
    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)
        return JSONResponse(serializer.errors, status=400)

@csrf_exempt
def snippet_detail(request, pk):
    """
    Retrieve, update or delete a code snippet.
    """
    try:
        snippet = Snippet.objects.get(pk=pk)
    except Snippet.DoesNotExist:
        return HttpResponse(status=404)

    if request.method == 'GET':
        serializer = SnippetSerializer(snippet)
        return JSONResponse(serializer.data)

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

    elif request.method == 'DELETE':
        snippet.delete()
        return HttpResponse(status=204)
EN

回答 3

Stack Overflow用户

发布于 2015-05-27 16:44:36

在您的文件urls.py中,用引号将snippets.urls括起来。

如下所示:

代码语言:javascript
复制
url(r'^',include('snippets.urls'))
票数 2
EN

Stack Overflow用户

发布于 2014-07-07 20:38:02

使用serializers.ModelSerializer

代码语言:javascript
复制
class SnippetSerializer(serializers.ModelSerializer):

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

这让DRF知道从指定的模型类Snippet中提取字段及其类型作为序列化程序的参数。您当前的版本仅使用serializers.Serializer。对于基本的Serializer类,您需要定义字段变量才能使其工作。如下例所示:

代码语言:javascript
复制
class SnippetSerializer(serializers.Serializer):
    pk = serializers.Field()  # Note: `Field` is an untyped read-only field.
    title = serializers.CharField(required=False,
                                  max_length=100)
    code = serializers.CharField(widget=widgets.Textarea,
                                 max_length=100000)
    linenos = serializers.BooleanField(required=False)
    language = serializers.ChoiceField(choices=LANGUAGE_CHOICES,
                                       default='python')
    style = serializers.ChoiceField(choices=STYLE_CHOICES,
                                    default='friendly')

此外,从views.py导入视图可能是一种更好的做法,如下所示:

代码语言:javascript
复制
from django.conf.urls import patterns, url
import views

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

Stack Overflow用户

发布于 2019-01-15 16:54:01

对我来说,解决问题的是文件名。确保文件serializers本身没有拼写问题,并且他的名字与代码中的名称相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24610532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档