Создать запретную зону - PullRequest
1 голос
/ 08 мая 2019

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

Это models.py :

...
from django.contrib.auth.models import User

class Post(models.Model):
    authorized_users = models.ManyToManyField(
        User,
        related_name="user_set",
        default=1,
        )
    title = models.CharField(max_length=100)
...

Как видите, один пост может иметь более одного автора ( author_users ).

Это views.py :

from django.shortcuts import redirect, render, get_object_or_404
from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.models import User


@permission_required('user.is_staff', raise_exception=True)
def listUsers(request):
    users_list = User.objects.all()
    context = {"users_list": users_list}
    template = 'usermanager/users_list.html'
    return render(request, template, context)

@permission_required('post.authorized_users=username', raise_exception=True)
def singleUser(request, username):
    user_single = get_object_or_404(User, username=username)
    context = {"user_single": user_single}
    template = 'usermanager/single_user.html'
    return render(request, template, context)

def listPost(request):
    posts_list = Post.objects.all()
    context = {"posts_list": posts_list}
    template = 'usermanager/list_post.html'
    return render(request, template, context)

def singlePost(request, pk):
    post_single = get_object_or_404(Post, pk=pk)
    context = {"post_single": post_single}
    template = 'usermanager/single_post.html'
    return render(request, template, context)

Если я вошел в систему как сотрудник, я могу видеть список пользователей ( view listUsers ) и одного пользователя со всеми его сообщениями ( view singleUser ); но если я вошел как не штатный пользователь, я вижу сообщение 403 Forbidden . Это не то, что я хочу видеть, потому что я хочу видеть только мой профиль и мои сообщения.

Как мне это решить?

1 Ответ

0 голосов
/ 01 июня 2019

Я решил использовать это:

def userProfile(request, username):
    if request.user.username == username:
        user_details = get_object_or_404(UserProfile, username=username)
    elif request.user.is_staff:
        user_details = get_object_or_404(UserProfile, username=username)
    else:
        raise PermissionDenied
    context = {
        "user_details": user_details,
        }
    template = 'usermanager/reading/user_profile.html'
    return render(request, template, context)

Можно использовать ту же стратегию для других представлений.

...