Skip to main content

Avoid boring views and urls.

Project description


When having a look at Ruby on Rails, I discovered a nice feature that was missing in Django: controllers. Contrary to what I often read, views in Django are not really equivalent to controllers in Rails. A Rails controller basically is a set of Django views and Django URL patterns. Apart from driving off boring URL work, this is a clean way to group views that belongs to the same model.

Any good djangonaut would make the connection with generic views − especially class-based. This is the easiest solution to avoid repeating the same code with a few changes. But this is not simplifying URL patterns and we often have to define such files:

from django.views.generic import ListView, DetailView  # and so on…
from .models import Example

class ExampleListView(ListView):
    model = Example

class ExampleDetailView(DetailView):
    model = Example

# and so on…
from django.conf.urls import patterns, url
from .views import *

urlpatterns = patterns('',
    url('^examples/$', ExampleListView.as_view(), name='example_index'),
    url('^examples/(?P<pk>\d+)$', ExampleDetailView.as_view(),
    # and so on…

With a single model, this looks easy. With complex applications containing dozens of models, this looks painful − and definitely not DRY [1].


django-viewsets proposes a solution inspired of Rails controllers. ViewSet is a class that builds a set of URL patterns from a set of class-based generic views. It is designed to be overridable, so that it fits standard as well as advanced use.


[sudo] pip install django-viewsets

You don’t have to change your project



Provided views and urls

Generic view URL URL name
ListView your-models/ your-model_index
DetailView your-models/[pk] your-model_detail
CreateView your-models/create/ your-model_create
UpdateView your-models/[pk]/update your-model_update
DeleteView your-models/[pk]/delete your-model_delete

Basic use

In your application (or project)

from django.conf.urls import patterns, url, include
from viewsets import ModelViewSet
from .models import YourModel

urlpatterns = patterns('',
    url('', include(ModelViewSet(YourModel).urls)),

You can also provide other basic attributes as keyword arguments. For example, if you want to use slugs instead of primary keys in URL patterns, lines 2 and 6 become:

from viewsets import ModelViewSet, SLUG  # line 2
url('', include(ModelViewSet(YourModel, id_pattern=SLUG).urls)),  # line 6

Advanced use

This allow more customization.

In your application

from viewsets import ModelViewSet
from .models import YourModel

class YourModelViewSet(ModelViewSet):
    model = YourModel

In your application (or project)

from django.conf.urls import patterns, url, include
from .views import YourModelViewSet

urlpatterns = patterns('',
    url('', include(YourModelViewSet().urls)),

What is interesting in this use is that you can easily customize views and urls. Let’s say you want to use primary keys in update and delete url patterns, but you want to use slugs in detail view. The fastest way to do it is:

from viewsets import ModelViewSet, SLUG

class CustomModelViewSet(ModelViewSet):
    def __init__(self, *args, **kwargs):
        self.views['detail_view']['pattern'] = SLUG
        super(CustomModelViewSet, self).__init__(*args, **kwargs)

Here we don’t set the model attribute, so that CustomModelViewSet can be used for any of your models. Of course, you can now use CustomModelViewSet with basic use as well as Advanced use. And we could have set model, if this viewset was meant to be used only with a specific model.

Basic Attributes

The model class from which ModelViewSet will create views and urls. This is the only mandatory attribute.
Overrides your-models in all URL patterns. Calculated from model._meta.verbose_name_plural if unset.
Overrides your-model in all URL names. Calculated from model._meta.verbose_name if unset.
Overrides [pk] in all URL patterns. You can either use viewsets.PK or viewsets.SLUG.
A sequence of keys from the views. Unset by default. Example: ('create_view', 'delete_view',).
Set this if your application has a URL namespace. It is used to redirect to main_view in delete_view. You can also set main_url.
Used to calculate main_url. 'list_view' by default.
The main url where delete_view redirects. If set, main_view is ignored.

Advanced attributes

Dictionary defining views and URLs. CRUD [2] by default.
[1]Don’t Repeat Yourself
[2]Create Read Update Delete

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django-viewsets-0.2.0.tar.gz (5.4 kB view hashes)

Uploaded source

Supported by

AWS AWS Cloud computing Datadog Datadog Monitoring Facebook / Instagram Facebook / Instagram PSF Sponsor Fastly Fastly CDN Google Google Object Storage and Download Analytics Huawei Huawei PSF Sponsor Microsoft Microsoft PSF Sponsor NVIDIA NVIDIA PSF Sponsor Pingdom Pingdom Monitoring Salesforce Salesforce PSF Sponsor Sentry Sentry Error logging StatusPage StatusPage Status page