避免无聊的视图和网址。
django-viewsets的Python项目详细描述
目录
Problematic
当查看ruby on rails时,我发现了一个很好的特性 Django失踪: controllers。 与我经常读到的相反,django的观点实际上并不等同于 轨道上的控制器。rails控制器基本上是一组django 视图和Django URL模式除了赶走无聊的url工作,这个 是对属于同一模型的视图进行分组的干净方法。
任何好的djangonaut都会与泛型视图建立连接,尤其是 class-based。 这是避免重复相同代码的最简单的解决方案 变化。但这并没有简化URL模式,我们通常必须定义 此类文件:
# views.py 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…
# urls.py 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(), name='example_detail'), # and so on… )
用一个模型,这看起来很简单复杂的应用程序包含 几十个模型,这看起来很痛苦-而且绝对不会干燥[1]。
Solution
django viewsets提出了一个受Rails控制器启发的解决方案。 ViewSet是一个类,它从一组 基于类的泛型视图。它的设计是可重写的,因此它适合 标准和高级使用
Usage
ModelViewSet
Provided views and urls
Generic view | URL | URL name |
^{tt4}$ | your-models/ | your-model_index |
^{tt5}$ | your-models/[pk] | your-model_detail |
^{tt6}$ | your-models/create/ | your-model_create |
^{tt7}$ | your-models/[pk]/update | your-model_update |
^{tt8}$ | your-models/[pk]/delete | your-model_delete |
Basic use
在您的应用程序(或项目)中url.py:
from django.conf.urls import patterns, url, include from viewsets import ModelViewSet from .models import YourModel urlpatterns = patterns('', url('', include(ModelViewSet(YourModel).urls)), )
您还可以提供其他basic attributes作为关键字参数为了 例如,如果要在URL模式中使用slug而不是主键, 第2行和第6行变为:
from viewsets import ModelViewSet, SLUG # line 2 url('', include(ModelViewSet(YourModel, id_pattern=SLUG).urls)), # line 6
Advanced use
这允许更多的定制。
在您的应用程序中views.py:
from viewsets import ModelViewSet from .models import YourModel class YourModelViewSet(ModelViewSet): model = YourModel
在您的应用程序(或项目)中url.py:
from django.conf.urls import patterns, url, include from .views import YourModelViewSet urlpatterns = patterns('', url('', include(YourModelViewSet().urls)), )
有趣的是,您可以轻松地自定义视图和 网址。假设您想在更新和删除url中使用主键 模式,但您希望在详细视图中使用slug。最快的方法 是:
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)
这里我们不设置model属性,这样CustomModelViewSet就可以 可用于任何型号当然,你现在可以使用 CustomModelViewSet与basic use以及Advanced use一起。我们 如果此视图集只用于 具体型号。
Basic Attributes
- model
- ModelViewSet将从中创建视图和URL的模型类这是 唯一的强制属性。
- base_url_pattern
- 覆盖所有url模式中的模型。计算依据 model._meta.verbose_name_plural如果未设置。
- base_url_name
- 覆盖所有URL名称中的模型计算依据 model._meta.verbose_name如果未设置。
- id_pattern
- 覆盖所有url模式中的[pk]。您可以使用viewsets.PK或 viewsets.SLUG.
- excluded_views
- 来自views的键序列默认不设置。 示例:('create_view', 'delete_view',).
- namespace
- 如果应用程序具有url命名空间,请设置此项。它用于重定向 删除视图中的main_view您还可以设置main_url。
- main_view
- 用于计算main_url。'list_view'默认。
- main_url
- 删除视图重定向的主url如果已设置,main_view将被忽略。
Advanced attributes
- views
- 定义视图和url的字典。默认情况下,crud[2]。
[1] | Don’t Repeat Yourself |
[2] | Create Read Update Delete |