1

次のURLを使用して、基本的なCRUD、ネストされたリソースの実装を考え出そうとしています:

デフォルトの引数 (私の場合はコンテンツ タイプ 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
        }
    ),
                   )

編集:

私が使用しているビューは、この投稿に触発されています

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
4

1 に答える 1

1

CBVドキュメント

クラスベースのビューでいくつかの単純な属性を変更するだけの場合は、それらをas_viewメソッド呼び出し自体に渡すだけです。

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

これを機能させるには、クラス属性を定義する必要があります

class ChildResourceMixin(object):
    content_type = None

これにより、as_view()からの引数の受け渡しが可能になります。

私はあなたのコードがどのように見えるかが好きです、それはシンプルで柔軟に見えます。

于 2012-08-29T09:34:56.547 に答える