Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在django中,任何用户都可以阻止任何用户,如果他们被阻止,他们就看不到被阻止用户的帖子,也找不到他们_Django_Django Models_Django Rest Framework_Django Views - Fatal编程技术网

在django中,任何用户都可以阻止任何用户,如果他们被阻止,他们就看不到被阻止用户的帖子,也找不到他们

在django中,任何用户都可以阻止任何用户,如果他们被阻止,他们就看不到被阻止用户的帖子,也找不到他们,django,django-models,django-rest-framework,django-views,Django,Django Models,Django Rest Framework,Django Views,在我的django中,我做了一些修改,这样用户就可以互相关注,并获得他们关注的用户的帖子。我现在想实现一个阻止系统,这样任何用户都可以阻止另一个用户,而被阻止的用户无法看到阻止他们的用户的个人资料或帖子 My models.py: class post(models.Model): title = models.CharField(max_length=100) image = models.ImageField(upload_to='post_pics', null=True, blank=T

在我的django中,我做了一些修改,这样用户就可以互相关注,并获得他们关注的用户的帖子。我现在想实现一个阻止系统,这样任何用户都可以阻止另一个用户,而被阻止的用户无法看到阻止他们的用户的个人资料或帖子

My models.py:

class post(models.Model):
title = models.CharField(max_length=100)
image = models.ImageField(upload_to='post_pics', null=True, blank=True)
video = models.FileField(upload_to='post_videos', null=True, blank=True)
content = models.TextField()
likes = models.ManyToManyField(User, related_name='likes', blank=True)
date_posted = models.DateTimeField(default=timezone.now)
author = models.ForeignKey(User, on_delete=models.CASCADE)

objects = postManager()

def __str__(self):
    return self.title

class Meta:
    ordering = ['-date_posted', 'title']

def get_absolute_url(self):
        return reverse ('blog-home')

def total_likes(self):
    return self.likes.count()

class UserProfileManager(models.Manager):
use_for_related_fields = True
def all(self):
    qs = self.get_queryset().all()
    try:
        if self.instance:
            qs = qs.exclude(user=self.instance)
    except:
        pass
    return qs

def toggle_follow(self, user, to_toggle_user):
    user_profile, created = UserProfile.objects.get_or_create(user=user)
    if to_toggle_user in user_profile.following.all():
       user_profile.following.remove(to_toggle_user)
       added = False
    else:
       user_profile.following.add(to_toggle_user)
       added = True
    return added

def is_following(self, user, followed_by_user):
    user_profile, created = UserProfile.objects.get_or_create(user=user)
    if created:
        return False
    if followed_by_user in user_profile.following.all():
        return True
    return False


class UserProfile(models.Model):
user      = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='owner', on_delete=models.CASCADE)
following = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='followed_by')

objects = UserProfileManager()

def __str__(self):
    return str(self.following.all().count())

def get_following(self):
    users = self.following.all()
    return users.exclude(username=self.user.username)

我认为可能有两种不同的方法,首先你有一个自定义的用户模型或配置文件。因此,在这个模型中添加一个新字段,它是“self”(用户模型本身)的一个may_to_many字段,它是被阻止的用户id持有者。 实现起来很简单

class Profile(models.Model):
    .......
    blocked_users = many_to_many_field(User, related_name="blocked_by")
第二个想法是创建一个新的模型,对用户模型有一个外键,并且对用户模型又有一个多对多关系

class Blocked(models.Model):
    user = foreign_key_field(User, related_name="blocked_users", ....)
     usres = many_to_many_field(User, related_name="blocked_by" )
所以你可以这样打电话:

user.blocked_users.users.all()
现在您可以访问一个被阻止的用户,所以通过使用查询集上的过滤器,可以忽略彼此被阻止的用户

from django.db.models import Q
# to ignore user X's blocked users posts
blocked_users = User.objects.get(username=X).blocked_users.users.all()
Post.objects.filter(~Q(author__in=blocked_users))

先生,你能帮我一下吗@《金骑士23》我觉得你需要代码来为你做这件事,而这不是你的目的。我会尝试自己解决这个问题,然后带着“为什么这不起作用”的具体问题回来不,先生,我只是不问代码,我只是想知道。我会为每一个用户自己制作一个阻止列表,我在问我如何才能获得阻止的真正功能,比如如果我阻止你,我将找不到你,无法获得帖子,就像其他社交媒体一样。@goldknight 23明白了!但让我举个例子,如果我在instagram中阻止了你,我将不会看到你的帖子,你也不会看到我的帖子。现在如果我想搜索你,我找不到你,因为我阻止了你。如何做到这一点function@MahdiFirouzjahdo对任何queryset进行相同的筛选都将为您提供所需的内容