sumanth
sumanth

Reputation: 781

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

I am trying to write a view in which a post can be created and in the same page, the object_list will be displayed. And even an object can be updated and deleted.

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

I would appreciate helping me in achieve this or suggesting a similar type of question.

Upvotes: 1

Views: 3594

Answers (2)

Faris Sbahi
Faris Sbahi

Reputation: 666

What you're looking for are Mixins.

Try creating a detail view class with the following parameters:

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

For example:

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

    queryset = Object.objects.all()

As has proposed by Daniel, if you like DRF, ViewSets are also a decent alternative. However, they're not exactly succinct so I generally avoid them when possible.

Something like a ModelViewSet, however, is extremely clear-cut and the approach I generally choose.

Here's an example:

class ObjectViewSet(viewsets.ModelViewSet):

    queryset = Object.objects.all()

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

Beautiful, isn't it?

For more details, see the DRF tutorial: http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/

Upvotes: 2

Daniel Barton
Daniel Barton

Reputation: 531

You are mixing view and template. View handle requests and template show content and links. You will have ListView, which will contain list of posts. In template you add forms for update, form for create and forms for delete. Each form will have attribute action with link to proper view. So update forms will have link to url with UpdateView, create forms to CreateView, and delete to DeleteView. In each form you set redirect back to ListView. This way if you want to use only Django.

OR

If you really want to everything handle on one page without refreshing and redirecting. You can use ajax and django-rest-framework and its viewset. In viewset you can handle lists, create, update, push, detail, in one class.

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

Upvotes: 1

Related Questions