【问题标题】:How to check user is a member of model object or not in Django?如何在 Django 中检查用户是否是模型对象的成员?
【发布时间】:2021-10-05 20:51:49
【问题描述】:

我在model.py中写了这个模型

class Group(models.Model):
   MEMBERS_NUMBER = [
      (2, 'Two people'),
      (5, '3 to 5'),
      (10, '5 to 10'),
   ]
   group_name = models.CharField(max_length=50)
   slug = models.SlugField(max_length=50, unique=True)
   members = models.IntegerField(choices=MEMBERS_NUMBER)
   people = models.ManyToManyField('Profile', through='Membership', blank = True)
   summary = models.TextField(
      'Summary and indeas',
      max_length=500,
      help_text='Say what you want to do with your study or jub partner.'
   )
   date_created = models.DateTimeField(default=timezone.now)

class Profile(models.Model):
  user = models.OneToOneField(User, on_delete=models.CASCADE)
  birth_date = models.DateField(blank=True, null=True)
  profile_picture = models.ImageField(default = 'default.jpeg', upload_to = 'profile_pics', null=True, blank = True)
  date_joined = models.DateTimeField(default=timezone.now, null=True, blank = True)

class Membership(models.Model):
  group = models.ForeignKey(Group, on_delete=models.CASCADE)
  members = models.ForeignKey(Profile, on_delete=models.CASCADE)

然后我为 Group 模型的每个对象创建了基于类的通用视图,但我想限制仅访问该 Group 对象中的配置文件,这是我的基于类的视图:

class GroupDetail(UserPassesTestMixin, generic.DetailView):
  model = models.Group
  context_object_name = 'group'
  template_name = 'projects/group_detail.html'

  def test_func(self):
    return self.request.user.profile.group_set.filter(group_name='My-Django-Group')

  def get_queryset(self):
    return models.Group.objects.all()

test_func(self) 检查用户是否是“My-Django-Group”的成员,然后向用户显示组详细信息,但我想获取我们在其中的对象名称,我对此进行了测试:

def test_func(self):  
return self.request.user.profile.group_set.filter(group_name=self.group.group_name)

但是没用

【问题讨论】:

    标签: django django-models django-views django-class-based-views django-permissions


    【解决方案1】:

    您可以使用以下方法过滤查询集:

    from django.contrib.auth.mixins import LoginRequiredMixin
    
    class GroupDetail(LoginRequiredMixin, generic.DetailView):
      model = models.Group
      context_object_name = 'group'
      template_name = 'projects/group_detail.html'
    
      def get_queryset(self):
        return super().get_queryset().filter(
            people__user=self.request.user
        )

    如果用户不是该组的成员,他们将收到 HTTP 404 响应。


    注意:您可以将视图限制为基于类的视图,以便通过身份验证的用户使用 LoginRequiredMixin mixin [Django-doc].

    【讨论】:

    • 谢谢,您的向导可以使用。有什么解决方案可以处理这个 404 响应吗?例如重定向到主页并显示 Flash 消息?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多