Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

<slug> path converter not working, but literal <slug> in URL works

When I try to visit this URL:

http://127.0.0.1:8000/slugtest/

I get 404 page. Here’s the message that I get:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

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.

However, if I use

http://127.0.0.1:8000/<slug>/

the page loads perfectly, but that’s not intended behavior.

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

What am I doing wrong here?

>Solution :

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

Easy mistake.

You have set everything up perfectly from what I can see, but you registered the route as literally /<slug> hehe 🙂 whereas I’m guessing you wanted a little API at the root of the app which accepts a slug url parameter? To prove this, try accessing /<slug>/slugtest

Django rest framework will do lots of magical things when you register a viewset. Including considering the lookupfield kwarg and url kwarg attributes you have set.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading