django.core.exceptions.ImproperlyConfigured:无法使用视图名称“用户详细信息”解析超链接关系的 URL

2024-01-06

TL;DR:我收到此错误,但不知道原因:

django.core.exceptions.ImproperlyConfigured:无法使用视图名称“user-detail”解析超链接关系的 URL。您可能未能在 API 中包含相关模型,或者错误地配置了该字段的“lookup_field”属性。

我正在经历django-rest-framework 教程 http://www.django-rest-framework.org/tutorial/3-class-based-views/目前,基于功能的视图 (FBV) 已切换为基于类、混合和通用的视图(分别为 CBV、MBV、GBV)。切换到 GBV 后,当我去测试我的 API 时,收到此错误AssertionError: Expected view SnippetDetail to be called with a URL keyword argument named "pk". Fix your URL conf, or set the '.lookup_field' attribute on the view correctly.。我做了一些研究发现lookup_field 需要设置为 urlpatterns http://www.django-rest-framework.org/api-guide/generic-views/#genericapiview。目前,我的 urls.py 如下所示:

from django.conf.urls import url, include
from rest_framework.urlpatterns import format_suffix_patterns
from snippets import views

# API endpoints
urlpatterns = format_suffix_patterns([
    url(r'^$', views.api_root),
    url(r'^snippets/$',
        views.SnippetList.as_view(),
        name='snippet-list'),
    url(r'^snippets/(?P<id>[0-9]+)/$',
        views.SnippetDetail.as_view(),
        name='snippet-detail'),
    url(r'^users/$',
        views.UserList.as_view(),
        name='user-list'),
    url(r'^users/(?P<id>[0-9]+)/$',
        views.UserDetail.as_view(),
        name='user-detail')
])

# Login and logout views for the browsable API
urlpatterns += [
    url(r'^auth/', include('rest_framework.urls',
                           namespace='rest_framework')),
]

我的views.py 看起来像这样:

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer, UserSerializer
from snippets.permissions import IsOwnerOrReadOnly

from rest_framework import generics
from rest_framework import permissions
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.reverse import reverse

from django.contrib.auth.models import User


@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 UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer


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


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

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)


class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly, )

当我添加lookup_field = 'id'在 UserDetail 和 SnippetDetail 中,异常都会自行解决。 (耶!)。但是,当我访问时http://127.0.0.1/users/1/ http://127.0.0.1/users/1/ ImproperlyConfigured: Could not resolve URL for hyperlinked relationship using view name "user-detail". You may have failed to include the related model in your API, or incorrectly configured the 'lookup_field' attribute on this field.被抛出。然而,当我检查控制台时,出现第二个异常:

django.urls.exceptions.NoReverseMatch:反转“用户详细信息” 未找到参数 '()' 和关键字参数 '{'pk': 1}'。 2 尝试的模式: ['users/(?P[0-9]+)\.(?P[a-z0-9]+)/?$', '用户/(?P[0-9]+)/$']

在处理上述异常的过程中,又出现了一个异常:

django.core.exceptions.ImproperlyConfigured:无法解析 URL 使用视图名称“用户详细信息”的超链接关系。你可能有 未能在您的 API 中包含相关模型,或者错误地包含相关模型 在此字段上配置“lookup_field”属性。

我发现有趣的是第一个例外的 kwargs 是{'pk': 1}, not {'id':1}。经过聊天的一些帮助后,有人向我指出this http://www.django-rest-framework.org/api-guide/generic-views/#genericapiview一点信息:

请注意,在使用超链接 API 时,如果需要使用自定义值,则需要确保 API 视图和序列化器类都设置查找字段。

这很有用,因为User串行器扩展HyperlinkedModelSerializer:

from rest_framework import serializers

from django.contrib.auth.models import User

from snippets.models import Snippet

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

the User模型和序列化器具有相反的关系Snippet。现在,当我添加lookup_field='id'的 snippets 属性UserSerializer (snippets = serializers.HyperlinkedRelatedField(many=True, view_name='snippet-detail', read_only=True, lookup_field='id')),就像它要求我这样做一样here http://www.django-rest-framework.org/api-guide/serializers/#how-hyperlinked-views-are-determined,错误是持续存在的。

我做错了什么?我可以做什么来解决这个问题?难道没有什么关系吗lookup_id?

我明白我可以替换<id> with <pk>在我的 urlpatterns 中,但我想了解why这正在发生。


对于学习完本教程后遇到此问题的其他人,这里是答案。

更改这些行

router.register(r'snippets', views.SnippetViewSet,basename="snippets")
router.register(r'users', views.UserViewSet,basename="users")

对于这些(注意单数基本名称)

router.register(r'snippets', views.SnippetViewSet,basename="snippet")
router.register(r'users', views.UserViewSet,basename="user")

如果您完全按照教程中的说明进行操作,它会生成这些路由器 URL(注意snippets-details)。这就是导致错误的原因

<URLPattern '^snippets\.(?P<format>[a-z0-9]+)/?$' [name='snippets-list']>
<URLPattern '^snippets/(?P<pk>[^/.]+)/$' [name='snippets-detail']>
<URLPattern '^snippets/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$' [name='snippets-detail']>
<URLPattern '^snippets/(?P<pk>[^/.]+)/highlight/$' [name='snippets-highlight']>
<URLPattern '^snippets/(?P<pk>[^/.]+)/highlight\.(?P<format>[a-z0-9]+)/?$' [name='snippets-highlight']>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

django.core.exceptions.ImproperlyConfigured:无法使用视图名称“用户详细信息”解析超链接关系的 URL 的相关文章

随机推荐

  • 以编程方式添加带有按钮的视图

    我想以编程方式添加一个视图和一个按钮 如下所示 问题是单击按钮时按钮没有反应 我的意思是它既不会突出显示也不会调用选择器 原因是我想为录音 声音文件 实现一个列表行 列表行应该可以选择进行向下钻取 并有一个播放按钮 所以我得到了一个Reco
  • 将给定行移动到 DataFrame 的末尾

    我想从 DataFrame 中获取给定的行并将其添加到相同的 DataFrame 中 我下面的代码就是这样做的 但我不确定我是否以正确的方式这样做 或者是否有更简单 更好 更快的方法 testdf df copy get row targe
  • Jetpack Compose 中具有等高行的网格布局

    喷气背包组成 我想创建一个像 UI 一样具有相同高度行的网格布局 但我找不到用于获取当前可用屏幕尺寸的函数 该应用程序应该看起来像这样 https i stack imgur com TTMQb png 结果应该是这样的 看看上面提到的链接
  • 在 Kotlin 中维护重复值的两个列表的交集

    我想找到两个列表之间公共元素的数量而不消除重复项 例如 input 1 3 3 4 3 3 output 2 因为共同元素是 3 3 input 1 2 3 4 3 3 output 1 因为共同元素是 3 如果我要使用 Kotlin 集合
  • 为什么 psycopg2 和 pyodbc 连接数据库的方式不同?我该如何翻译连接?

    所以我一直在努力寻找一个好的模块来查询我公司的 POSTGRES 数据库中的信息 周围有很多模块 但我似乎只能让 pyodbc 工作 为什么 pyodbc 的连接形式与 psycopg2 不同 后者似乎是更高级的模块 我如何将连接查询从一种
  • 数组索引超出范围的二维数组

    我有一个二维数组 但没有 行数为 1 并且没有 列数 gt 1 double T new double 1 24 System out println T 1 length 但是当我打印列的长度时 它说索引超出范围 但是当我打印以下内容时
  • Android停止录音失败

    我将启动一项服务来开始录音 当我试图停止时 它显示以下消息 06 27 17 21 30 138 E MediaRecorder 6122 stop called in an invalid state 0 我不确定其他功能 例如上传数据到
  • Symfony 表单事件将错误添加到特定字段

    我的场景如下 如果用户从 maxRedemptionForDiscount 中选择 true 并在 maxRedemptionForDiscountValue 中输入 0 则应该有一条错误消息呈现到特定字段 在 TextType 字段的位置
  • 打印机忽略 javax.print.attribute.PrintRequestAttributeSet 选项

    我必须使用 javax print api 打印文件 纯文本 我能够查找打印机并提交打印作业 但我只能打印该文件的一份副本 下面是我一直在使用的代码 打印机无法识别我使用 PrintRequestAttributeSet 指定的任何选项 属
  • 安装的构建工具修订版 28.0.3 已损坏。如何修复此错误

    当我创建一个新项目时 然后构建项目或尝试在模拟器中运行应用程序 使用 sdk api level 28 Android 9 0 Pie 构建输出窗口总是显示此错误 Installed Build Tools revision 28 0 3
  • 创建新线程的测试方法以及我们从事件中获得的结果(NUnit 2.6)

    我的课程有一个公共方法Start 一个私有方法和一个事件Finishing Start call new Thread private method 私有方法使用事件返回值 当这个方法完成工作后 再调用这个事件 现在我想为这个类编写测试 如
  • BASH 脚本暂停/继续脚本内的进程

    在我正在编写的 bash 脚本中 我试图在后台启动一个进程 睡眠 然后挂起它 最后 该过程完成 由于某种原因 当我发送带有停止信号的kill命令时 它只是继续运行 就好像它没有收到任何消息一样 我可以从命令行执行此操作 但 bash 脚本未
  • 应用程序可以在 Android 和 IOS 模拟器中运行,但在发布后不能运行

    Problem 我创建了一个应用程序 它是 MQTT 代理客户端 当我使用 iOS Android 模拟器进行开发时 我与代理的连接工作正常 但是 当我发布 apk 版本时 我的应用程序无法连接 它有套接字问题 AMQJS0007E 套接字
  • 如何在Python中使用OpenSSL从pfx文件中提取密钥?

    我需要签署一份xml与certificate and key from a pfx file 换句话说 我有一个 pfx 文件 我需要从其中提取pem an key签署我的xml 我发现这个脚本可以从 pfx 中提取笔和密钥 但出现错误 i
  • 任意多边形的宽度

    我需要一种方法来表征二维点集的大小 这样我就可以根据视口的比例来确定是否将它们渲染为空间中的单个点或代表性多边形 我已经有一个算法来计算该集合的凸包以生成代表性多边形 但我需要一种方法来表征其大小 一个明显的衡量标准是凸包上点之间的最大距离
  • 子类化 beautifulsoup html 解析器,出现类型错误

    我使用 beautifulsoup 很棒的 html 解析器编写了一个小包装器 最近 我尝试改进代码并使所有 beautifulsoup 方法直接在包装类中可用 而不是通过类属性 我认为子类化 beautifulsoup 解析器将是实现此目
  • 使用 CoreGraphics 在视网膜显示屏上绘图 - 图像像素化

    在我的 iOS 应用程序中 我尝试使用 CoreGraphics 绘制曲线 绘图本身工作正常 但在视网膜显示器上 图像是使用相同的分辨率绘制的 并且像素不会加倍 结果是像素化图像 我正在使用以下函数进行绘图 void touchesMove
  • 如何全局更改Android首选项图标颜色

    我已经为我的所有首选项设置了平面图标 我想全局更改该图标的颜色 当我尝试下面的代码时 它甚至改变了工具栏中的后退按钮颜色 我只想全局更改首选项图标色调 预先感谢
  • C++ 抽象类不能有带有该类参数的方法

    我创建了这个 h 文件 pragma once namespace Core class IComparableObject public virtual int CompareTo IComparableObject obj 0 但编译器
  • django.core.exceptions.ImproperlyConfigured:无法使用视图名称“用户详细信息”解析超链接关系的 URL

    TL DR 我收到此错误 但不知道原因 django core exceptions ImproperlyConfigured 无法使用视图名称 user detail 解析超链接关系的 URL 您可能未能在 API 中包含相关模型 或者错