当我尝试访问此 URL 时:
我收到 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/