首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 ><slug>路径转换器不工作,但<slug>中的文字<slug>工作

<slug>路径转换器不工作,但<slug>中的文字<slug>工作
EN

Stack Overflow用户
提问于 2022-10-25 15:36:43
回答 1查看 25关注 0票数 2

当我试图访问这个URL时:

http://127.0.0.1:8000/slugtest/

我得到404页。以下是我得到的信息:

代码语言:javascript
复制
Using the URLconf defined in scrap.urls, Django tried these URL patterns, in this order:

admin/
api-auth/
getpage/
^<slug>/$ [name='ArticleInfoViewSet-list']
^<slug>/(?P<slug>[^/.]+)/$ [name='ArticleInfoViewSet-detail']
__debug__/

The current path, slugtest/, didn’t match any of these.

但是,如果我使用

http://127.0.0.1:8000//

页面加载得很完美,但这不是预期的行为。

models.py

代码语言:javascript
复制
class Article(models.Model):

    url = models.CharField(max_length=255,validators=[RegexValidator(regex=website_regex)])
    slug = models.CharField(max_length=255, null=True)
    unique_id = models.CharField(max_length=255, unique=True, null=True)

views.py

代码语言:javascript
复制
class ArticleInfoViewSet(ModelViewSet):
    serializer_class = ArticleInfoSerializer
    lookup_url_kwarg = 'slug'
    lookup_field = 'slug'

def get_queryset(self):
    queryset = Article.objects.prefetch_related('data')
    return queryset

serializer.py

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

    data = ArticleDataSerializer(many=True)

class Meta:
    model = Article
    fields = ['url', 'data', 'slug']
    lookup_field = ['slug']
    read_only_fields = ['url', 'data', 'slug']

urls.py

代码语言:javascript
复制
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls')),
    path('getpage/', include('getpage.urls')),
    path('', include('getpage.urls2')),
    path('__debug__/', include('debug_toolbar.urls')),
]

urls2.py

代码语言:javascript
复制
from . import views
from rest_framework_nested import routers

router = routers.SimpleRouter()
router.register('<slug>', views.ArticleInfoViewSet, basename='ArticleInfoViewSet')
urlpatterns = router.urls

我在这里做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-25 15:49:47

代码语言:javascript
复制
router.register('', views.ArticleInfoViewSet, basename='ArticleInfoViewSet')

容易出错。

从我所能看到的情况来看,您已经完美地设置了一切,但是您注册了路径为字面上的/<slug> hehe :)而我猜您希望在这个应用程序的根部设置一个小API,这个应用程序接受一个slug参数?要证明这一点,请尝试访问/<slug>/slugtest

Django rest框架在注册一个视图集时会做很多神奇的事情。包括考虑您设置的查找字段kwarg和url kwarg属性。DRF还将根据您的viewset配置自动生成相关的url模式,因此在使用viewset时不需要指定和url参数,但是有一些方法可以配置它和自定义路径。

我不建议在应用程序的根部放置带有段塞参数的API,在路径的前面加上"api/“,这样它就会变成api/slugtest,更好的是,对于viewset,api/articles/slugtest

所以你会更改网址:

代码语言:javascript
复制
urlpatterns = [
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls')),
    path('getpage/', include('getpage.urls')),
    path('api', include('getpage.urls2')),
    path('__debug__/', include('debug_toolbar.urls')),
]

并将其注册为文章

代码语言:javascript
复制
router.register('articles', views.ArticleInfoViewSet, basename='ArticleInfoViewSet')
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74196663

复制
相关文章

相似问题

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