【问题标题】:Reverse_Lazy is not redirecting me to the sprcified URLReverse_Lazy 没有将我重定向到指定的 URL
【发布时间】:2021-02-19 18:24:02
【问题描述】:

我想为我的用户和超级用户制作一个按钮,以便能够在 django 管理中删除他们的帖子。当我单击删除按钮时,它既不会将我重定向到指定的 URL,也不会删除帖子。我使用 mixins 来让管理员删除每个人的每个帖子,但用户只能删除他们的帖子。

#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"),

#我的主页 HTML 页面

 {% 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 %}

#我的 Html 删除页面

        <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>

【问题讨论】:

    标签: django django-views django-templates mixins


    【解决方案1】:

    这是有道理的,因为您的 DeleteArticleAccessMixin 从不删除任何内容。它仅检查您的用户是否具有适当的访问权限。您可以从DeletionMixin [Django-doc] 继承。您还可以通过覆盖 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
            )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-29
      • 2014-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2012-10-24
      • 1970-01-01
      • 2012-09-02
      相关资源
      最近更新 更多