Django ограничивает пользователя в редактировании данных, которые ему не принадлежат

У меня есть url,

path('faculty/edit/<str:pk>/', faculty.edit_form, name="faculty-edit"),
path('faculty/delete/<str:pk>', faculty.delete, name="faculty-delete"),

localhost:8000/user/faculty/edit/1

В вышеприведенном примере, 1 - это идентификатор данных, который принадлежит пользователю x! Аналогично, у меня есть 1000 данных

Теперь, когда я вхожу в систему под именем user=y и перехожу по той же ссылке, открывается страница редактирования! Но данные 1 принадлежат пользователю x - как с этим быть? Как это ограничить?

Делает ли django это автоматически или нам нужно сделать это вручную?

Мой вид редактирования:

def edit_form(request, pk):
    faculty = Faculty.objects.get(id=pk)
    
    form = AddFacultyForm(instance=faculty)
    if request.method == 'POST':
        form = AddFacultyForm(request.POST, instance=faculty)
        if form.is_valid():
            form.save()
            return redirect('faculty')

    context = {'form':form}
    return render(request, 'faculty/edit_form.html', context)

Теперь добавление моделей,

#Faculty
from django.db import models
from .profile import University

class Faculty(models.Model):
    owner = models.ForeignKey(University, on_delete=models.CASCADE)
    faculty_name = models.CharField(max_length=128, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)

#Univ Profile
from django.db import models
from django.contrib.postgres.fields import ArrayField
from unireo.users.models import User

class University(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)

В представлении мы можем отфильтровать объект Faculty так, чтобы Faculty имел Profile, который связан с вошедшим пользователем с:

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

@login_required
def edit_form(request, pk):
    faculty = get_object_or_404(Faculty, id=pk, owner__user=request.user)
    # …

это вернет ответ HTTP 404, если запрос сделан пользователем, с которым Faculty объект не связан.

Я бы также посоветовал, если первичные ключи числовые, работать с конвертером путей <int:…> [Django-doc], чтобы "выстреливать" представление только если первичный ключ - это последовательность цифр, а не какая-либо строка:

path('faculty/edit/<int:pk>/', faculty.edit_form, name='faculty-edit'),
path('faculty/delete/<int:pk>/', faculty.delete, name='faculty-delete'),

Вместо этого вы можете вернуть перенаправление с помощью:

from django.contrib.auth.decorators import login_required
from django.http import Http404
from django.shortcuts import get_object_or_404, redirect

@login_required
def edit_form(request, pk):
    try:
        faculty = get_object_or_404(Faculty, id=pk, owner__user=request.user)
    except Http404:
        return redirect('%%%name-of-some-view%%%')
    # …

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


Примечание: Обычно лучше использовать settings.AUTH_USER_MODEL [Django-doc] для ссылки на модель пользователя, чем использовать User модель [Django-doc] напрямую. Для получения дополнительной информации вы можете посмотреть ссылка на User модель раздел документации .

Вернуться на верх