omushpapa
omushpapa

Reputation: 1742

How to return an empty form in ModelFormMixin

DetailStory subclasses DetailView and ModelFormMixin thus presenting the DetailView of a certain story and a form at the end. However, on filling the form and submitting the data, the data is saved in the databases but it is still shown on the form (in addition to the one now displayed on the DetailView). How do I present an empty form after submitting it? (Here is the code sample)

class DetailStory(DetailView, ModelFormMixin):
    model = Story
    template_name = 'stories/detail_story.html'
    context_object_name = 'detail'
    form_class = CommentForm

    def get(self, request, *args, **kwargs):
        self.object = None
        self.form = self.get_form(self.form_class)

        return DetailView.get(self, request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.object = None
        self.form = self.get_form(self.form_class)

        if self.form.is_valid():
            obj = self.form.save(commit=False)
            obj.user = self.request.user
            obj.memoir = self.get_object()
            self.object = obj.save()

        return self.get(request, *args, **kwargs)

    def get_object(self):
        item_id = crypt.decode(self.kwargs['story_id'])[0]
        obj = get_object_or_404(Story, Q(privacy='public') | Q(user_id=self.request.user.id), pk=item_id)

        return obj

Upvotes: 0

Views: 74

Answers (1)

Sayse
Sayse

Reputation: 43330

get_form uses the request data to construct the form as per the docs

If the request is a POST or PUT, the request data (request.POST and request.FILES) will also be provided.

So simply don't make your post function go back through the get, just have it redirect to your required place or do anything differently to pointing it at the get function.

return redirect('mynamespace:story_detail', story_id=self.object.pk)

You may wish to read this answer for a list of technical details you should consider whilst making your application. In particular,

Redirect after a POST if that POST was successful, to prevent a refresh from submitting again.

Upvotes: 1

Related Questions