将默认参数传递给基于类的视图

时间:2012-08-29 06:35:11

标签: python django django-views

我试图想出一个基本的CRUD,嵌套资源实现,并使用以下URL:

我无法弄清楚如何将默认参数(在我的情况下为内容类型ID)传递给视图。以下是我使用的内容。任何完成此任务的指针,或者如果这是完全废话,还有更好的方法来实现这个目标吗?

urlpatterns = patterns('',
   url (
       regex = '^/?$',
       view =  ParentResourceListView.as_view(),
       name = 'parent_resource_list'
   ),

   url (
       regex = r'^(?P<pk>\d+)/$',
       view =  ParentResourceDetailView.as_view(),
       name = 'parent_resource_detail'
   ),
   url (
       regex = r'^new/$',
       view =  ParentResourceCreateView.as_view(),
       name = 'parent_resource_create'
   ),

   url (
       regex = '^(?P<pk>\d+)/delete/$',
       view =  ParentResourceDeleteView.as_view(),
       name = 'parent_resource_delete'
   ),
   url (
       regex = '^(?P<pk>\d+)/edit/$',
       view =  ParentResourceUpdateView.as_view(),
       name = 'parent_resource_update'
   ),
)


urlpatterns += patterns('',
                   url (
    regex = r'^(?P<object_id>\d+)/child_resources$',
    view =  ChildResourceListView.as_view(),
    name = 'parent_resource_child_resource_list',
    kwargs = {
        "content_type",
        ContentType.objects.get_for_model(ParentResource).id
        }
    ),
                   url (
    regex = r'^(?P<object_id>\d+)/child_resources/(?P<pk>\d+)/$',
    view =  ChildResourceDetailView.as_view(),
    name = 'parent_resource_child_resource_detail',
    kwargs = {
        "content_type",
        ContentType.objects.get_for_model(ParentResource).id
        }
    ),
                   url (
    regex = r'^(?P<object_id>\d+)/child_resources/new/$',
    view =  ChildResourceCreateView.as_view(),
    name = 'parent_resource_child_resource_create',
    kwargs={
        "content_type",
        ContentType.objects.get_for_model(ParentResource).id
        }
    ),

                   url (
    regex = '^(?P<object_id>\d+)/child_resource/(?P<pk>\d+)/delete/$',
    view =  ChildResourceDeleteView.as_view(),
    name = 'parent_resource_child_resource_delete',
    kwargs={
        "content_type",
        ContentType.objects.get_for_model(ParentResource).id
        }
    ),
                   url (
    regex = '^(?P<object_id>\d+)/child_resource/(?P<pk>\d+)/edit/$',
    view =  ChildResourceUpdateView.as_view(),
    name = 'parent_resource_child_resource_update',
    kwargs={
        "content_type",
        ContentType.objects.get_for_model(ParentResource).id
        }
    ),
                   )

编辑:

我使用的观点受this帖子

的启发
class ParentResourceMixin(object):
    model = ParentResource
    def get_success_url(self):
        return reverse('parent_resource_list')
    def get_queryset(self):
        return ParentResource.objects.all()


class ParentResourceListView(ParentResourceMixin, ListView):
    pass


class ParentResourceDetailView(ParentResourceMixin, DetailView):
    pass


class ParentResourceCreateView(ParentResourceMixin, CreateView):
    pass


class ParentResourceDeleteView(ParentResourceMixin, DeleteView):
    pass


class ParentResourceUpdateView(ParentResourceMixin, UpdateView):
    pass

编辑(基于jpic答案的解决方案):

子资源视图是:

class ChildResourceMixin(object):

    content_type = None

    model = ChildResource
    def get_success_url(self):
        return reverse('child_resource_list')
    def get_queryset(self):
        return ChildResource.objects.all()


class ChildResourceListView(ChildResourceMixin, ListView):
    pass


class ChildResourceDetailView(ChildResourceMixin, DetailView):
    pass


class ChildResourceCreateView(ChildResourceMixin, CreateView):
    pass


class ChildResourceDeleteView(ChildResourceMixin, DeleteView):
    pass


class ChildResourceUpdateView(ChildResourceMixin, UpdateView):
    pass

1 个答案:

答案 0 :(得分:1)

CBV docs

  

如果您只是在基于类的视图上更改一些简单属性,则只需将它们传递给as_view方法调用本身

ParentResourceListView.as_view(
    content_type=ContentType.objects.get_for_model(ParentResource).id)

为此,you should define a class attribute,即

class ChildResourceMixin(object):
    content_type = None

这将启用从as_view()传递的参数。

我喜欢你的代码看起来像它看起来简单而灵活。