当我试图访问这个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//
页面加载得很完美,但这不是预期的行为。
models.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)views.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 querysetserializer.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']urls.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我在这里做错什么了?
发布于 2022-10-25 15:49:47
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
所以你会更改网址:
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')https://stackoverflow.com/questions/74196663
复制相似问题