В Django ограничить пользователей определенными URL-адресами - PullRequest
2 голосов
/ 09 июля 2020

У меня есть следующие URL-адреса в моем Django приложении:

path('rooms/<room_id>',views.home,name='home'),

модели :

class ChatRoom(models.Model):
    eid = models.CharField(max_length=64, unique=True)
    name = models.CharField(max_length=25)

просмотров

def rooms(request):
    room = UserProfile.objects.filter(user=request.user).values()[0]['room_id']
    rooms = ChatRoom.objects.all().values()
    user = User.objects.filter(username=request.user)
    return render(request,'chat/rooms.html',{'rooms':rooms,'room_user':room})

Здесь переменная, т.е. зависит от идентификатора модели комнаты. Пользователь может входить только в одну комнату. Следовательно, пользователь может получить доступ только к одному , скажем «4». Итак, пользователь может получить доступ только к комнатам / 4 /. Как я могу запретить пользователю вводить другие URL-адреса, например, / rooms / 5 /?.

1 Ответ

1 голос
/ 09 июля 2020

Возможно, вы захотите сделать ForeignKey из UserProfile в модель ChatRoom:

class UserProfile(models.Model):
    <b>room</b> = models.<b>ForeignKey(</b>ChatRoom, on_delete=models.PROTECT<b>)</b>
    # &hellip;

Затем вы можете отфильтровать комнаты, чтобы разрешить только одну, созданную пользователем с:

from django.contrib.auth.decorators import login_required

@login_required
def rooms(request):
    # the ChatRoom or None
    room = ChatRoom.objects.filter(userprofile__user=request.user).first()
    return render(request,'chat/rooms.html',{'room': room})

Поскольку пользователь может принадлежать только к одной комнате, как вы говорите, это, таким образом, одна комната.

В вашем методе home мы можем использовать get_object_or_404(…) [Django -doc] , чтобы поднять 404 в случае, если комната не принадлежит пользователю:

from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404

@login_required
def home(request, room_id):
    room = <b>get_object_or_404(</b>ChatRoom, eid=room_id, userprofile__user=request.user<b>)</b>
    # &hellip;

При этом, если пользователь может быть только член одного ChatRoom, тогда нет смысла включать его в URL. Вы можете просто войти в чат, как показано выше.

Примечание : вы можете ограничить просмотры представлением для аутентифицированных пользователей с помощью декоратора @login_required [Django -doc] .

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