{ "info": { "author": "Bertrand Bordage", "author_email": "bordage.bertrand@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Internet :: WWW/HTTP :: Dynamic Content" ], "description": "===============\ndjango-viewsets\n===============\n\n.. contents::\n\nProblematic\n===========\n\nWhen having a look at *Ruby on Rails*, I discovered a nice feature that was\nmissing in Django:\n`controllers `_.\nContrary to what I often read, views in Django are not really equivalent to\ncontrollers in Rails. A Rails controller basically is **a set of Django\nviews and Django URL patterns**. Apart from driving off boring URL work, this\nis a clean way to group views that belongs to the same model.\n\nAny good djangonaut would make the connection with generic views \u2212 especially\n`class-based `_.\nThis is the easiest solution to avoid repeating the same code with a few\nchanges. But this is not simplifying URL patterns and we often have to define\nsuch files:\n\n::\n\n # views.py\n from django.views.generic import ListView, DetailView # and so on\u2026\n from .models import Example\n\n\n class ExampleListView(ListView):\n model = Example\n\n\n class ExampleDetailView(DetailView):\n model = Example\n\n # and so on\u2026\n\n::\n\n # urls.py\n from django.conf.urls import patterns, url\n from .views import *\n\n\n urlpatterns = patterns('',\n url('^examples/$', ExampleListView.as_view(), name='example_index'),\n url('^examples/(?P\\d+)$', ExampleDetailView.as_view(),\n name='example_detail'),\n # and so on\u2026\n )\n\nWith a single model, this looks easy. With complex applications containing\ndozens of models, **this looks painful** \u2212 and definitely not DRY [1]_.\n\n\nSolution\n========\n\n*django-viewsets* proposes a solution inspired of Rails controllers.\n``ViewSet`` is a class that builds a set of URL patterns from a set of\nclass-based generic views. It is designed to be overridable, so that it fits\nstandard as well as advanced use.\n\n\nInstallation\n============\n\n``[sudo] pip install django-viewsets``\n\nYou don't have to change your project `settings.py`.\n\n\nUsage\n=====\n\n``ModelViewSet``\n----------------\n\nProvided views and urls\n.......................\n\n============== ========================= ===================\n Generic view URL URL name\n-------------- ------------------------- -------------------\n``ListView`` *your-models/* *your-model_index*\n``DetailView`` *your-models/[pk]* *your-model_detail*\n``CreateView`` *your-models/create/* *your-model_create*\n``UpdateView`` *your-models/[pk]/update* *your-model_update*\n``DeleteView`` *your-models/[pk]/delete* *your-model_delete*\n============== ========================= ===================\n\nBasic use\n.........\n\nIn your application (or project) `urls.py`::\n\n from django.conf.urls import patterns, url, include\n from viewsets import ModelViewSet\n from .models import YourModel\n\n urlpatterns = patterns('',\n url('', include(ModelViewSet(YourModel).urls)),\n )\n\n\nYou can also provide other `basic attributes`_ as keyword arguments. For\nexample, if you want to use slugs instead of primary keys in URL patterns,\nlines 2 and 6 become::\n\n from viewsets import ModelViewSet, SLUG # line 2\n url('', include(ModelViewSet(YourModel, id_pattern=SLUG).urls)), # line 6\n\n\nAdvanced use\n............\n\nThis allow more customization.\n\nIn your application `views.py`::\n\n from viewsets import ModelViewSet\n from .models import YourModel\n\n class YourModelViewSet(ModelViewSet):\n model = YourModel\n\n\nIn your application (or project) `urls.py`::\n\n from django.conf.urls import patterns, url, include\n from .views import YourModelViewSet\n\n urlpatterns = patterns('',\n url('', include(YourModelViewSet().urls)),\n )\n\n\nWhat is interesting in this use is that you can easily customize views and\nurls. Let's say you want to use primary keys in update and delete url\npatterns, but you want to use slugs in detail view. The fastest way to do it\nis::\n\n from viewsets import ModelViewSet, SLUG\n\n class CustomModelViewSet(ModelViewSet):\n def __init__(self, *args, **kwargs):\n self.views['detail_view']['pattern'] = SLUG\n super(CustomModelViewSet, self).__init__(*args, **kwargs)\n\n\nHere we don't set the ``model`` attribute, so that ``CustomModelViewSet`` can\nbe used for any of your models. Of course, you can now use\n``CustomModelViewSet`` with `basic use`_ as well as `Advanced use`_. And we\ncould have set ``model``, if this viewset was meant to be used only with a\nspecific model.\n\n\nBasic Attributes\n................\n\n``model``\n The model class from which ModelViewSet will create views and urls. This is\n the only mandatory attribute.\n\n``base_url_pattern``\n Overrides *your-models* in all URL patterns. Calculated from\n ``model._meta.verbose_name_plural`` if unset.\n\n``base_url_name``\n Overrides *your-model* in all URL names. Calculated from\n ``model._meta.verbose_name`` if unset.\n\n``id_pattern``\n Overrides *[pk]* in all URL patterns. You can either use ``viewsets.PK`` or\n ``viewsets.SLUG``.\n\n``excluded_views``\n A sequence of keys from the ``views``. Unset by default.\n Example: ``('create_view', 'delete_view',)``.\n\n``namespace``\n Set this if your application has a URL namespace. It is used to redirect\n to ``main_view`` in delete_view. You can also set ``main_url``.\n\n``main_view``\n Used to calculate ``main_url``. ``'list_view'`` by default.\n\n``main_url``\n The main url where delete_view redirects. If set, ``main_view`` is ignored.\n\n\nAdvanced attributes\n...................\n\n``views``\n Dictionary defining views and URLs. CRUD [2]_ by default.\n\n\n.. [1] Don't Repeat Yourself\n.. [2] Create Read Update Delete", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/BertrandBordage/django-viewsets", "keywords": null, "license": "BSD License", "maintainer": null, "maintainer_email": null, "name": "django-viewsets", "package_url": "https://pypi.org/project/django-viewsets/", "platform": "OS Independent", "project_url": "https://pypi.org/project/django-viewsets/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/BertrandBordage/django-viewsets" }, "release_url": "https://pypi.org/project/django-viewsets/0.1.9/", "requires_dist": null, "requires_python": null, "summary": "Avoid boring views and urls.", "version": "0.1.9" }, "last_serial": 1725097, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "601b170cc65314b6611c2097dec3a2e7", "sha256": "720057a23a8f7fb82463a61b590bed94387aedcf27b7cf079031c9bf0b985411" }, "downloads": -1, "filename": "django-viewsets-0.1.tar.gz", "has_sig": false, "md5_digest": "601b170cc65314b6611c2097dec3a2e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3509, "upload_time": "2013-01-26T02:06:38", "url": "https://files.pythonhosted.org/packages/4e/c7/3f40a9eaa3e5b1d2788ce4f3b1684d381759882b6e7f34f7a7cde0640539/django-viewsets-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "94899c533eca19af5f00d7eabf34d41e", "sha256": "24cfe23cbab67dfa7e527a9bf368e644bb8b8ab19bb471c6d6f059e970fc12b3" }, "downloads": -1, "filename": "django-viewsets-0.1.1.tar.gz", "has_sig": false, "md5_digest": "94899c533eca19af5f00d7eabf34d41e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 3861, "upload_time": "2013-01-28T19:30:20", "url": "https://files.pythonhosted.org/packages/2d/58/818c1693607165542ecbfddcae75c2cc190618f6bb507c8c93ad06db4c3f/django-viewsets-0.1.1.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "1784b66be4035ef7fca14eef4ba1d82e", "sha256": "86ad2c784b9bd2a8e7e470c72c820afab1a09d26e9e323d7b12b61dfd5d75282" }, "downloads": -1, "filename": "django-viewsets-0.1.2.tar.gz", "has_sig": false, "md5_digest": "1784b66be4035ef7fca14eef4ba1d82e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4129, "upload_time": "2013-01-29T02:05:25", "url": "https://files.pythonhosted.org/packages/42/b7/d2f4e645e5b94b767b89a69e61b1feadc5d447cebfcfea7e51af4e8607d9/django-viewsets-0.1.2.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "75fb403bc621a9c828f0c69c0559c92d", "sha256": "783a3a746fbf6bbeb4b06c54af8bc8b0094c5cdbf5e7cbb15bf95eec513fe356" }, "downloads": -1, "filename": "django-viewsets-0.1.3.tar.gz", "has_sig": false, "md5_digest": "75fb403bc621a9c828f0c69c0559c92d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4190, "upload_time": "2013-01-29T02:45:55", "url": "https://files.pythonhosted.org/packages/24/a3/0ddd0cdffcc49581ff76d958cd0dffb98fcff8a280a5a4236de613e83a5b/django-viewsets-0.1.3.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "640a62190e625d4d4c452e87e6d20bd4", "sha256": "d79419008e7b573d72a6ba36ee77f41d5e95d643d540262311cb0770dfb7a2f5" }, "downloads": -1, "filename": "django-viewsets-0.1.4.tar.gz", "has_sig": false, "md5_digest": "640a62190e625d4d4c452e87e6d20bd4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4205, "upload_time": "2013-01-29T03:25:31", "url": "https://files.pythonhosted.org/packages/69/67/083801b1d34ef91a98f087d77740bc9eecc702b50f2d6eb26bc065c25fd8/django-viewsets-0.1.4.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "fe9c2d8649834f9348a5399e3f9deac5", "sha256": "a2b8966e04bdc8ebaf4ec8df57f5080c6dff0f338a28022974f80ea3397521c4" }, "downloads": -1, "filename": "django-viewsets-0.1.5.tar.gz", "has_sig": false, "md5_digest": "fe9c2d8649834f9348a5399e3f9deac5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5341, "upload_time": "2013-02-03T19:35:05", "url": "https://files.pythonhosted.org/packages/de/de/2d325146970c35ca1d4c698351004974a225a4dfa46f3d59e5e2309840eb/django-viewsets-0.1.5.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "b8fe8efd68cea022963bce2700922c66", "sha256": "a08dc644a873b9a5226ea822411c8f5177da54e9abef271397a61878c5f6c31d" }, "downloads": -1, "filename": "django-viewsets-0.1.6.tar.gz", "has_sig": false, "md5_digest": "b8fe8efd68cea022963bce2700922c66", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5367, "upload_time": "2013-05-09T11:02:43", "url": "https://files.pythonhosted.org/packages/de/47/5ed87b031784bb345f4f8ab7462179685d37cd79ecc87d372b516ad7aa23/django-viewsets-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "4ca8c87ef8c688fd4be42cf1e9073fef", "sha256": "e23b95edaf78e90706abbb29a8796b2abeeeab791155c23545696bcbd0869981" }, "downloads": -1, "filename": "django-viewsets-0.1.7.tar.gz", "has_sig": false, "md5_digest": "4ca8c87ef8c688fd4be42cf1e9073fef", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5389, "upload_time": "2013-06-13T13:37:45", "url": "https://files.pythonhosted.org/packages/8e/37/c90f90ba61d6f364dd4276fee872f0104798a60d8eb2d97b88ea58679b34/django-viewsets-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "01105919d9121f8ee3cd463991bef39d", "sha256": "901140c90f14818e634ba9b37e71017bafa591baefb92064a81aa174a4891b76" }, "downloads": -1, "filename": "django-viewsets-0.1.8.tar.gz", "has_sig": false, "md5_digest": "01105919d9121f8ee3cd463991bef39d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5367, "upload_time": "2015-07-04T21:18:49", "url": "https://files.pythonhosted.org/packages/27/fb/d698c3acd08ef864971607e9fd4157fe1b5fd376e19f4101007134ccb5ec/django-viewsets-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "8e3d98c761f4065dad689439c31c298c", "sha256": "52760ad06d2987924861f73ff12cc98e878bd734d0200d0c776c607b9cc635f6" }, "downloads": -1, "filename": "django-viewsets-0.1.9.tar.gz", "has_sig": false, "md5_digest": "8e3d98c761f4065dad689439c31c298c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5366, "upload_time": "2015-09-16T13:21:25", "url": "https://files.pythonhosted.org/packages/b1/ce/dd1f746876e84758ed57ac045fc8edbbceec7a5b47dc43d17e0ef0608fb4/django-viewsets-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8e3d98c761f4065dad689439c31c298c", "sha256": "52760ad06d2987924861f73ff12cc98e878bd734d0200d0c776c607b9cc635f6" }, "downloads": -1, "filename": "django-viewsets-0.1.9.tar.gz", "has_sig": false, "md5_digest": "8e3d98c761f4065dad689439c31c298c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5366, "upload_time": "2015-09-16T13:21:25", "url": "https://files.pythonhosted.org/packages/b1/ce/dd1f746876e84758ed57ac045fc8edbbceec7a5b47dc43d17e0ef0608fb4/django-viewsets-0.1.9.tar.gz" } ] }