Im trying to come up with a basic CRUD, nested resource implementation, with the following urls:
I cant figure out how to pass a default argument (the content type id, in my case) to the view. Below is what Ive used. Any pointers to accomplish this, or if this is total crap, any better way to accomplish this?
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
}
),
)
Edit:
The views Im using are inspired by this post
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
Edit (solution based on jpic’s answer):
The child resource views are:
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
CBV docs:
For this to work, you should define a class attribute, ie.
This will enable argument passing from as_view().
I like what your code looks like, it looks simple and flexible.