[Django]-How to add a cancel button to DeleteView in django

21πŸ‘

βœ…

Your approach of overriding the post method and checking to see if the cancel button was pressed is ok. You can redirect by returning an HttpResponseRedirect instance.

from django.http import HttpResponseRedirect

class AuthorDelete(DeleteView):
    model = Author
    success_url = reverse_lazy('author-list')

    def post(self, request, *args, **kwargs):
        if "cancel" in request.POST:
            url = self.get_success_url()
            return HttpResponseRedirect(url)
        else:
            return super(AuthorDelete, self).post(request, *args, **kwargs)

I’ve used get_success_url() to be generic, its default implementation is to return self.success_url.

πŸ‘€Alasdair

16πŸ‘

Why don’t you simply put a β€œCancel” link to the success_url instead of a button? You can always style it with CSS to make it look like a button.

This has the advantage of not using the POST form for simple redirection, which can confuse search engines and breaks the Web model. Also, you don’t need to modify the Python code.

12πŸ‘

If using CBV’s you can access the view directly from the template

<a href="{{ view.get_success_url }}" class="btn btn-default">Cancel</a>

Note: you should access it through the getter in case it has been subclassed.

This is noted in the ContextMixin docs

The template context of all class-based generic views include a view
variable that points to the View instance.

πŸ‘€Inti

1πŸ‘

Having an element of type button, will not send a POST request. Therefore, you can use this to do a http redirection like this:

<button type="button" onclick="location.href='{{ BASE_URL }}replace-with-url-to-redirect-to/'">Cancel</button>

0πŸ‘

This is probably the easiest way to do what OP asks:

<input type="submit" value="Confirm" />
* <a href="{% url 'success_url' %}"><button type="button">Cancel</button></a>
πŸ‘€x0lani

-1πŸ‘

Do you even need the get_success_url, why not just use:

Cancel

and go to any other url you want?

πŸ‘€steve

Leave a comment