9

I'm trying to set up Django REST Framework with Django 2.0 project which means url(r'^something/' ... has been replaced with path(something/ ....

I'm trying to work out how to set up my rest_framework patterns.

This is what I have:

router = routers.DefaultRouter()
router.register(r'regulations', api.RegulationViewSet)
router.register(r'languages', api.LanguageViewSet)


urlpatterns = [
    ...
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    ...
]

If I go to http://127.0.0.1:8000/regulations I simply get:

Page not found (404)

How should I set up my urlpatterns?

2
  • 1
    url() has not been replaced. It is still valid. path() is an alternative. Note, however, you don't seem to have defined a URL for /regulations. Commented Feb 27, 2018 at 9:30
  • 1
    @DanielRoseman But he has registered regulations with the router. He needs to implement it in the urlpatterns with include or by concatenating: urlpatterns += router.urls. Commented Feb 27, 2018 at 10:03

2 Answers 2

15
urlpatterns = [
    ...
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    ...
]

with path('', include(router.urls)), you can get:

http://127.0.0.1:8000/regulations/
http://127.0.0.1:8000/languages/

with

path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),

you can get:

http://127.0.0.1:8000/api-auth/{other paths}
Sign up to request clarification or add additional context in comments.

2 Comments

This will result in http://localhost:8000/api-auth/regulations. Also rest_framework.urls is right too, but it is for the authentication routes provided by Django REST Framework. The routers.urls should be included under another path.
Then you should remove the last sentence and add explanation.
3

After registering the router you have to include it in the urlpatterns. The way how @Ykh suggested is technically correct, but with regards to content is missing the point.

urlpatterns = [
    # here you include your router
    path('', include(router.urls)),
    # here you include the authentication paths
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
]

Now you'll have the following routes:

http://localhost:8000/regulations/
http://localhost:8000/languages/

plus:

http://localhost:8000/api-auth/{other paths}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.