Reverse_Lazy is not redirecting me to the sprcified URL

Viewed 66

I want to make a button for my users and the superuser to be able to delete their posts in django administration. When I click on delete button neither it redirects me to the specified URL nor deleting the post. I have used mixins in order to let admin to delete every post from everyone but the users can only delete their posts.

#MIXIN.py

class DeleteArticleAccessMixin():
def dispatch(self, request, pk, *args, **kwargs):
    article = get_object_or_404(Article, pk=pk)
    if article.author == request.user or request.user.is_superuser:
        return super().dispatch(request, *args, **kwargs)
    else:
        raise Http404("Access Denied!")

#Views.py

class ArticleDelete(DeleteArticleAccessMixin, DetailView):
model = Article
success_url = reverse_lazy('account:home')
template_name = "registration/article_confirm_delete.html"

#urls.py

path('article/delete/<int:pk>', ArticleDelete.as_view(), name="article-delete"),

#My home HTML page

 {% if user.is_superuser or user.is_author %}
  <a class="badge text-danger badge-primary"
  href="{% url "account:article-delete"  article.pk %}">Delete Article</a>
  {% endif %}

#My Html Delete page

        <div class="col-md-8 text-center mx-auto">
            <div class="card card-danger">
              <div class="card-header">
                <h3 class="card-title">Delete Article</h3>
              </div>
                <div class="card-body py-4">
             <form method="post">{% csrf_token %}
    <p class="py-2">Are you sure you want to delete "{{ object }}" written by
    "{{ object.author.get_full_name }}"?</p>
    <input type="submit" value="Confirm" class="btn btn-danger">
</form>
                </div>
            </div>
    </div>
1 Answers

That makes sense, since your DeleteArticleAccessMixin never deletes something. It only checks if your user has the proper access rights. You can subclass from the DeletionMixin [Django-doc]. You can furthermore control access by overriding get_queryset:

from django.views.generic.edit import DeletionMixin

class ArticleDelete(DeletionMixin, DetailView):
    model = Article
    success_url = reverse_lazy('account:home')
    template_name = 'registration/article_confirm_delete.html'

    def get_queryset(self, *args, **kwargs):
        qs = super().get_queryset(*args, **kwargs)
        if self.request.user.is_superuser:
            return qs
        return qs.filter(
            author=self.request.user
        )
Related