python - <slug> 路径转换器不起作用,但 URL 中的文字 <slug> 有效

标签 python django

当我尝试访问此 URL 时:

http://127.0.0.1:8000/slugtest/

我收到 404 页面。这是我收到的消息:

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/<slug>/

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

模型.py

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)

View .py

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

序列化器.py

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

url.py

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

from . import views
from rest_framework_nested import routers

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

我在这里做错了什么?

最佳答案

router.register('', views.ArticleInfoViewSet, basename='ArticleInfoViewSet')

容易犯的错误。

据我所知,您已将所有内容设置得非常完美,但您将路线注册为字面意思 /<slug>呵呵 :) 而我猜你想在应用程序的根部有一个接受 slug url 参数的 API?为了证明这一点,请尝试访问/<slug>/slugtest

当你注册一个 View 集时,Django Rest框架会做很多神奇的事情。包括考虑您设置的lookupfield kwarg 和url kwarg 属性。 DRF 还会根据您的 View 集配置自动生成相关的 url 模式,因此为什么您在使用 View 集时不需要指定 url 参数,但是有一些方法可以配置它并自定义路径。

我不建议将带有 slug 参数的 API 放在应用程序的根目录中,在路径的某处添加“api/”前缀可能更合适,这样它就会变成 api/slugtest更好的是,对于文章 View 集,api/articles/slugtest

所以你会改变网址:

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

最后将其注册为文章

router.register('articles', views.ArticleInfoViewSet, basename='ArticleInfoViewSet')

关于python - <slug> 路径转换器不起作用,但 URL 中的文字 <slug> 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74196663/

相关文章:

python - PyQt:悬停按钮时更改光标

python - 迭代循环以更改条件语句,python

django - 如何让用户只获取与他们相关的对象(通过多对多关系)?

css - Django 不会显示静态文件

python - Django - 无法获取对象列表中对象的特定主键(id)

python - 使 df.apply 成为索引和列函数的最佳方法

python - 根据 Python 中的键获取排序列表的一部分

python - 检测生成器函数是否为空,否则迭代它

django - 模板标签中已翻译的枚举字段

python - 如何添加基于列值限制外键数量的 Django 约束?