Django / Python:如何在单个视图或通用视图中编写创建,列表,更新和删除?

时间:2016-08-16 22:59:06

标签: django django-views django-generic-views

我正在尝试编写一个可以创建帖子的视图,并且在同一页面中,将显示object_list。甚至可以更新和删除对象。

Country Capital
India   Delhi       UPDATE DELETE
USA     Washington  UPDATE DELETE
-----   ------

我希望帮助我实现这一目标或提出类似的问题。

2 个答案:

答案 0 :(得分:1)

您正在混合视图和模板。查看句柄请求和模板显示内容和链接。 您将拥有ListView,其中包含帖子列表。在模板中,您可以添加更新表单,创建表单和删除表单。每个表单都有属性操作,并链接到正确的视图。因此,更新表单将链接到使用UpdateView的url,创建表单到CreateView,以及删除到DeleteView。在每个表单中,您将重定向设置回ListView。这样,如果你只想使用Django。

如果你真的想要在一个页面上处理所有内容而不刷新和重定向。您可以使用ajax和django-rest-framework及其viewset。在视图集中,您可以在一个类中处理列表,创建,更新,推送,详细信息。

<强>视图集:

class UserViewSet(viewsets.ViewSet):
    """
    Example empty viewset demonstrating the standard
    actions that will be handled by a router class.

    If you're using format suffixes, make sure to also include
    the `format=None` keyword argument for each action.
    """

    def list(self, request):
        pass

    def create(self, request):
        pass

    def retrieve(self, request, pk=None):
        pass

    def update(self, request, pk=None):
        pass

    def partial_update(self, request, pk=None):
        pass

    def destroy(self, request, pk=None):
        pass

答案 1 :(得分:1)

你正在寻找的是Mixins。

尝试使用以下参数创建详细视图类:

mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView

例如:

class ObjectDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin, generics.GenericAPIView):

    queryset = Object.objects.all()

正如Daniel所提出的,如果你喜欢DRF,ViewSets也是一个不错的选择。但是,它们并不完全简洁,所以我通常会尽可能避免使用它们。

然而,像ModelViewSet这样的东西非常明确,我通常会选择这种方法。

以下是一个例子:

class ObjectViewSet(viewsets.ModelViewSet):

    queryset = Object.objects.all()

    def perform_create(self, serializer):
        serializer.save(owner=self.request.user)

美丽,不是吗?

有关详细信息,请参阅DRF教程:http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/