我试图想出一个基本的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
答案 0 :(得分:1)
如果您只是在基于类的视图上更改一些简单属性,则只需将它们传递给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()传递的参数。
我喜欢你的代码看起来像它看起来简单而灵活。