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
модель раздел документации .