Django/Python: 如何在单个View或通用视图中编写Create、List、Update和Delete?

Django/Python: How to write Create, List, Update and Delete in a single View or a generic view?

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

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

我很乐意帮助我实现这一目标或提出类似类型的问题。

您正在混合使用视图和模板。查看处理请求和模板显示内容和 links。 您将拥有 ListView,其中将包含帖子列表。在模板中,您可以添加用于更新的表单、用于创建的表单和用于删除的表单。每个表单都将具有带有 link 的属性 action 以正确查看。所以更新表单会有link到url用UpdateView,创建表单到CreateView,删除到DeleteView。在每种形式中,您都将重定向设置回 ListView。如果你只想使用 Django 这样的话。

如果您真的希望所有内容都在一个页面上处理而无需刷新和重定向。您可以使用 ajax 和 django-rest-framework and its viewset。在视图集中,您可以在一个 class.

中处理列表、创建、更新、推送、详细信息

视图集:

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

你要找的是 Mixins。

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

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/