Конвертер путей <slug> не работает, но буквальный <slug> в URL работает
Когда я пытаюсь посетить этот 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>/
страница загружается отлично, но это не предполагаемое поведение.
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 queryset
serializer.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
Что я делаю не так?
router.register('', views.ArticleInfoViewSet, basename='ArticleInfoViewSet')
Легкая ошибка.
Вы настроили все идеально, насколько я могу судить, но вы зарегистрировали маршрут как буквально /<slug>
хехе :), тогда как я предполагаю, что вы хотели иметь небольшой API в корне приложения, который принимает параметр slug url? Чтобы доказать это, попробуйте получить доступ к /<slug>/slugtest
Django rest framework будет делать много волшебных вещей, когда вы регистрируете viewset. Включая учет заданных вами атрибутов lookupfield kwarg и url kwarg.