【问题标题】:Permission-Based Class Based Views Django基于权限的基于类的视图 Django
【发布时间】:2021-01-21 07:31:22
【问题描述】:

如果您是成员列表的一部分,如何才能使您只能查看成员列表。 我什至不知道 MemberListView 中的“所需权限”是什么,因为这部分是由我的专家朋友完成的,所以我将其注释掉。 (希望有人也可以分享这是什么,编写基于类的视图超级新手)

基本上,对于我当前的代码,我尝试使它,如果当前登录的用户不属于列表,他们将被重定向。

models.py

class BlogPost(models.Model):
 chief_title                    = models.CharField(max_length=50, null=False, blank=False, unique=True)
 body                   = models.TextField(max_length=5000, null=False, blank=False)
 members    = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name="members")
 author                     = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)


class Account(AbstractBaseUser):
 email                  = models.EmailField(verbose_name="email", max_length=60, unique=True)
 username               = models.CharField(max_length=30, unique=True)

views.py

class MemberListView(LoginRequiredMixin,BlogPostMixin, DetailView):
    login_url = 'must_authenticate'    
    template_name = "HomeFeed/membersof_yourpost.html"
    #permission_required = ('blogpost.view_all_blogpost_members')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if self.request.user in object.members.all:
            return render('HomeFeed/membersof_yourpost.html', context)
        else:
            return render('HomeFeed/snippets/home.html', context)

模板:

<ul>
    {% for member in object.members.all %}
    <li>{{member.username}}</li>
    {% endfor %}
</ul>

基于 Niespodd 的回答:

class MemberListView(LoginRequiredMixin,BlogPostMixin, DetailView):
    def dispatch(self, request, *args, **kwargs):
        if self.request.user in self.get_object().members.all:
            return redirect('HomeFeed:member_list')


基于 JPG 答案:

class MemberListView(LoginRequiredMixin, UserPassesTestMixin, BlogPostMixin, DetailView):
    login_url = 'must_authenticate'    
    template_name = "HomeFeed/membersof_yourpost.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        if self.request.user in object.members.all:
            return render('HomeFeed/membersof_yourpost.html', context)
        else:
            return render('HomeFeed/snippets/home.html', context)

    def test_func(self):
        post = self.get_object()
        return self.request.user in post.members.objects.all()

【问题讨论】:

标签: django django-models django-views django-forms django-templates


【解决方案1】:

permission_required 指的是PermissionRequiredMixinBlogPostMixin 很可能继承自该PermissionRequiredMixin。它记录在这里:https://docs.djangoproject.com/en/3.1/topics/auth/default/#the-permissionrequiredmixin-mixin

使用PermissionRequiredMixin 的默认实现,用户将获得拒绝访问错误页面。

如果您不熟悉基于类的视图,最简单的解决方案是简单地覆盖 MemberListView 上的 dispatch 方法并在那里检查用户的成员资格。

类似的东西:

class MemberListView( ... ):
    def dispatch( ... ):
        if self.request.user in self.get_object().members.all:
            return redirect( ... )

【讨论】:

【解决方案2】:

我宁愿使用UserPassesTestMixin--(doc) 类来处理权限

from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin


class MemberListView(
    LoginRequiredMixin,
    UserPassesTestMixin,
    BlogPostMixin,
    DetailView
):
    login_url = 'must_authenticate'
    template_name = "HomeFeed/membersof_yourpost.html"

    def test_func(self):
        post = self.get_object()
        return self.request.user in post.members.all()

注意:在这种情况下,您不需要重写 get_context_data() 方法,最重要的是,get_context_data() 方法应该返回一个 dict 喜欢对象

【讨论】:

  • 嗨 JPG,不确定这是不是您的意思?我已将您建议我做的事情包含在问题中并出现错误:属性错误:'ManyRelatedManager' object has no attribute 'objects'
  • 根据我的阅读,测试函数只是确保用户在成员列表中正确吗?那么获取上下文数据将有助于进行重定向?
  • 抱歉,打错了,应该是post.members.all()(更新了答案)
  • 不,除非test_func(...) 方法返回True,否则执行不会读取到get_context_data() 方法
  • 兄弟,现在它说 403 禁止...所以我想它有效吗?有没有办法让博文的作者总是自动出现在成员列表中?
【解决方案3】:
obj.save()
obj.members.add(request.user) #change is here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-12
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多