diff options
| author | Xavier Ordoquy | 2015-01-10 10:41:12 +0100 |
|---|---|---|
| committer | Xavier Ordoquy | 2015-01-10 10:41:12 +0100 |
| commit | d8dbd8679080035de4e785a8e7b998fb01f4052b (patch) | |
| tree | baceae881ed53e5a25295367f6a58bb6fe1c131e /api-guide/routers/index.html | |
| parent | c1e4ec0c64933da5411e4cc3e63894d5f82cc337 (diff) | |
| download | django-rest-framework-d8dbd8679080035de4e785a8e7b998fb01f4052b.tar.bz2 | |
Update documentation
Diffstat (limited to 'api-guide/routers/index.html')
| -rw-r--r-- | api-guide/routers/index.html | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/api-guide/routers/index.html b/api-guide/routers/index.html index 32022b86..70d136f4 100644 --- a/api-guide/routers/index.html +++ b/api-guide/routers/index.html @@ -475,6 +475,32 @@ urlpatterns = router.urls </code></pre> <p>This means you'll need to explicitly set the <code>base_name</code> argument when registering the viewset, as it could not be automatically determined from the model name.</p> <hr /> +<h3 id="using-include-with-routers">Using <code>include</code> with routers</h3> +<p>The <code>.urls</code> attribute on a router instance is simply a standard list of URL patterns. There are a number of different styles for how you can include these URLs.</p> +<p>For example, you can append <code>router.urls</code> to a list of existing views…</p> +<pre><code>router = routers.SimpleRouter() +router.register(r'users', UserViewSet) +router.register(r'accounts', AccountViewSet) + +urlpatterns = [ + url(r'^forgot-password/$, ForgotPasswordFormView.as_view(), +] + +urlpatterns += router.urls +</code></pre> +<p>Alternatively you can use Django's <code>include</code> function, like so…</p> +<pre><code>urlpatterns = [ + url(r'^forgot-password/$, ForgotPasswordFormView.as_view(), + url(r'^', include(router.urls)) +] +</code></pre> +<p>Router URL patterns can also be namespaces.</p> +<pre><code>urlpatterns = [ + url(r'^forgot-password/$, ForgotPasswordFormView.as_view(), + url(r'^api/', include(router.urls, namespace='api')) +] +</code></pre> +<p>If using namespacing with hyperlinked serializers you'll also need to ensure that any <code>view_name</code> parameters on the serializers correctly reflect the namespace. In the example above you'd need to include a parameter such as <code>view_name='api:user-detail'</code> for serializer fields hyperlinked to the user detail view.</p> <h3 id="extra-link-and-actions">Extra link and actions</h3> <p>Any methods on the viewset decorated with <code>@detail_route</code> or <code>@list_route</code> will also be routed. For example, given a method like this on the <code>UserViewSet</code> class:</p> @@ -492,6 +518,22 @@ class UserViewSet(ModelViewSet): <ul> <li>URL pattern: <code>^users/{pk}/set_password/$</code> Name: <code>'user-set-password'</code></li> </ul> +<p>If you do not want to use the default URL generated for your custom action, you can instead use the url_path parameter to customize it.</p> +<p>For example, if you want to change the URL for our custom action to <code>^users/{pk}/change-password/$</code>, you could write:</p> +<pre><code>from myapp.permissions import IsAdminOrIsSelf +from rest_framework.decorators import detail_route + +class UserViewSet(ModelViewSet): + ... + + @detail_route(methods=['post'], permission_classes=[IsAdminOrIsSelf], url_path='change-password') + def set_password(self, request, pk=None): + ... +</code></pre> +<p>The above example would now generate the following URL pattern:</p> +<ul> +<li>URL pattern: <code>^users/{pk}/change-password/$</code> Name: <code>'user-change-password'</code></li> +</ul> <p>For more information see the viewset documentation on <a href="../../viewsets.html#marking-extra-actions-for-routing">marking extra actions for routing</a>.</p> <h1 id="api-guide">API Guide</h1> <h2 id="simplerouter">SimpleRouter</h2> |
