Я понял, что в системе блокировки есть ограничение.

В основном, основываясь на обсуждаемых кодах, я сделал так, что когда я блокирую пользователя, я не смогу видеть его сообщения в домашней ленте на странице с подробностями. Я не смогу добавлять комментарии или отправлять что-либо к его посту. Но потом я понял, что заблокированные нами пользователи по-прежнему могут видеть мой пост, мою страницу с подробными сведениями и добавлять комментарии / отправлять что-либо к моим сообщениям. Это как бы свело на нет цель блокирующей системы.

Как мне сделать так, чтобы с точки зрения человека, которого я заблокировал, он также не мог просматривать мои сообщения, комментировать мое сообщение или отправлять что-либо в мое сообщение?

Models.py

class Account(AbstractBaseUser):
 email                  = models.EmailField(verbose_name="email", max_length=60, unique=True)
 username               = models.CharField(max_length=30, unique=True)
 blocked_users = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name='blocked_by_user')

Views.py, где я пытался реализовать функциональность блока реализации

type_of_post = TypeofPostFilter(request.GET, queryset=BlogPost.objects.exclude((Q(author_id__in=request.user.blocked_users.all()) | Q(author = request.user))).order_by('date_updated'))
if blog_post.author in user.blocked_users.all(): 
    return redirect(reverse('HomeFeed:detail', kwargs={'slug': slug}))
if comment.name in comment.post.author.blocked_users.all(): 
    return redirect(reverse('HomeFeed:main'))

Views.py для блочной системы:

def block_user(request, pk):
    user = request.user
    user_to_block = Account.objects.get(pk=pk)
    user.blocked_users.add(user_to_block)
    if user_to_block == user:
        return HttpResponse("You can't block yourself")

    return redirect('account:view', user_id=user_to_block.pk)

1
user14916310 21 Янв 2021 в 12:54

2 ответа

Лучший ответ

Обычно в представлении своего профиля вы должны сделать следующее:

def profile(request, pk):
    user = User.objects.get(pk=pk)
    if request.user in user.blocked_users.all():
        return HttpResponse('This user blocked you') #  or something else
    else:
        return render(request, 'profile.html', {'user', user})


def home(request): # view that shows all posts
    posts = BlogPost.objects.exclude(post_author__in=request.user.blocked_users.all())
    return render(request, 'home.html', {'posts': posts})

Кроме того, для начала было бы разумно сделать так, чтобы пользователи не могли видеть все сообщения, а только от пользователей, с которыми они дружат. Для просмотра сообщений заблокированного пользователя используйте ту же логику, что и для профиля .

0
SLDem 21 Янв 2021 в 10:16

Поскольку у вас для related_name установлено значение blocked_by_user, вы можете фильтровать на этой основе:
По вашему мнению:

type_of_post = TypeofPostFilter(request.GET, queryset=BlogPost.objects.exclude((Q(author_id__in=request.user.blocked_users.all()) | Q(author = request.user) | Q(author_id__in=request.user.blocked_by_user.all()))).order_by('date_updated'))
if blog_post.author in user.blocked_users.all() or blog_post.author in user.blocked_by_user.all(): 
    return redirect(reverse('HomeFeed:detail', kwargs={'slug': slug}))
if comment.name in comment.post.author.blocked_users.all() or comment.name in comment.post.author.blocked_by_user.all(): 
    return redirect(reverse('HomeFeed:main'))
2
Abdul Aziz Barkat 21 Янв 2021 в 10:07