Конвертер путей <slug> не работает, но буквальный <slug> в URL работает

Когда я пытаюсь посетить этот 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>/

страница загружается отлично, но это не предполагаемое поведение.

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.

Вернуться на верх