django.urls.exceptions.NoReverseMatch:找不到“用户列表”的反向。 “用户列表”不是有效的视图函数或模式名称

时间:2019-11-28 03:34:30

标签: django django-rest-framework

教程5:关系和超链接API错误 教程链接地址为:https://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/ 我尝试了与查询相关的解决方案,并且在stackoverflow上遇到了类似的问题,但是经过测试,我仍然无法使用它们。

views.py

class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,)

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)
class SnippetDetail(generics.RetrieveDestroyAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly)


class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer


class UserDetail(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer


@api_view(['GET'])
def api_root(request, format=None):
    return Response({
        'users': reverse('user-list', request=request, format=format),
        'snippets': reverse('snippet-list', request=request, format=format),
    })


class SnippetHighlight(generics.GenericAPIView):
    queryset = Snippet.objects.all()
    renderer_classes = [renderers.StaticHTMLRenderer]

    def get(self, request, *args, **kwargs):
        snippet = self.get_object()
        return Response(snippet.highlighted)

urls.py

urlpatterns = format_suffix_patterns([
    path('', views.api_root),
    path('snippets/', views.SnippetList.as_view(), name='snippet-list'),
    path('snippets/<int:pk>/', views.SnippetDetail.as_view(), name='snippet-detail'),
    path('snippets/<int:pk>/highlight/',  views.SnippetHighlight.as_view(), name='snippet-highlight'),
    path('users/', views.UserList.as_view(), name='user-list'),
    path('users/<int:pk>/', views.UserDetail.as_view(), name='user-detail'),
])
urlpatterns += [
    path(r'api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

serializers.py

class SnippetSerializer(serializers.HyperlinkedModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    highlight = serializers.HyperlinkedIdentityField(view_name='snippet-highlight', format='html')

    class Meta:
        model = Snippet
        fields = ['url', 'id', 'highlight', 'owner',
              'title', 'code', 'linenos', 'language', 'style']


class UserSerializer(serializers.HyperlinkedModelSerializer):
    snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True)

    class Meta:
        model = User
        fields = ['url', 'id', 'username', 'snippets']

跟踪错误:

Traceback:
File "C:\Anaconda3\envs\python36\lib\site-packages\django\core\handlers\exception.py" in inner 34. response = get_response(request)

File "C:\Anaconda3\envs\python36\lib\site-packages\django\core\handlers\base.py" in _get_response 126. response = self.process_exception_by_middleware(e, request)

File "C:\Anaconda3\envs\python36\lib\site-packages\django\core\handlers\base.py" in _get_response 124. response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Anaconda3\envs\python36\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view 54. return view_func(*args, **kwargs)

File "C:\Anaconda3\envs\python36\lib\site-packages\django\views\generic\base.py" in view 68. return self.dispatch(request, *args, **kwargs)

File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\views.py" in dispatch 505. response = self.handle_exception(exc)

File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\views.py" in handle_exception 465. self.raise_uncaught_exception(exc)

File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\views.py" in raise_uncaught_exception 476. raise exc

File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\views.py" in dispatch 502. response = handler(request, *args, **kwargs)

File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\decorators.py" in handler 50. return func(*args, **kwargs)

File "C:\Users\Ze Ran Lu\Desktop\swie\text\tutorials\snippets\views.py" in api_root 205. 'users': reverse('user-list'),

File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\reverse.py" in reverse 47. url = _reverse(viewname, args, kwargs, request, format, **extra)

File "C:\Anaconda3\envs\python36\lib\site-packages\rest_framework\reverse.py" in _reverse 60. url = django_reverse(viewname, args=args, kwargs=kwargs, **extra)

File "C:\Anaconda3\envs\python36\lib\site-packages\django\urls\base.py" in reverse 90. return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))

File "C:\Anaconda3\envs\python36\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix 622. raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at / Exception Value: Reverse for 'user-list' not found. 'user-list' is not a valid view function or pattern name.

4 个答案:

答案 0 :(得分:0)

reverse只接受以下参数:

  

reverse(viewname,urlconf = None,args = None,kwargs = None,   current_app =无)

并且您的users/不接受任何参数,因此您只需要反向输入网址名称

reverse('user-list')

答案 1 :(得分:0)

内部服务器错误:/ 追溯(最近一次通话):   内部文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ core \ handlers \ exception.py”,第34行     响应= get_response(请求)   _get_response中的文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ core \ handlers \ base.py”,第126行     响应= self.process_exception_by_middleware(e,请求)   文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ core \ handlers \ base.py”,第124行,_get_response     响应= wraped_callback(请求,* callback_args,** callback_kwargs)   文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ views \ decorators \ csrf.py”,第54行,在wrapped_view中     返回view_func(* args,** kwargs)   视图中的文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ views \ generic \ base.py”,行68     返回self.dispatch(request,* args,** kwargs)   在分派中的文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ views.py”,第505行     响应= self.handle_exception(exc)   在handle_exception中的第465行,文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ views.py”     self.raise_uncaught_exception(exc)   文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ views.py”,第476行,raise_uncaught_exception     提高经验   派发文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ views.py”,第502行     响应=处理程序(请求,* args,** kwargs)   处理程序中的文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ decorators.py”,第50行     return func(* args,** kwargs)   文件“ C:\ Users \ Ze Ran Lu \ Desktop \ swie \ text \ tutorials \ snippets \ views.py”,第205行,位于api_root中     '用户':反向('用户列表'),   文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ reverse.py”,第47行,反过来     url = _reverse(viewname,args,kwargs,request,format,** extra)   文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ rest_framework \ reverse.py”,第60行,_reverse     url = django_reverse(viewname,args = args,kwargs = kwargs,** extra)   文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ urls \ base.py”,第90行,反过来     返回iri_to_uri(resolver._reverse_with_prefix(视图,前缀,* args,** kwargs))   文件“ C:\ Anaconda3 \ envs \ python36 \ lib \ site-packages \ django \ urls \ resolvers.py”,第622行,_reverse_with_prefix     提高NoReverseMatch(msg) django.urls.exceptions.NoReverseMatch:找不到“用户列表”的反向。 “用户列表”不是有效的视图函数或模式名称。

答案 2 :(得分:0)

enter image description here 另一个url.py文件是

from django.contrib import admin
from django.urls import path
from django.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('snippets.urls'))
]

答案 3 :(得分:0)

项目结构

教程     | _片段     | | _urls.py     | | _views.py     | | _models.py     | | _apps.py     | | _admin.py     | _教程         | _urls.py         | _settings.py         | _wsgi.py