Как лучше всего ограничивать права пользователей при редактировании экземпляров модели
Я строю простое приложение с использованием аутентификации пользователя.
Мое приложение имеет 3 модели:
- Пользователи: стандартная модель пользователя Django
- Расположение: модель для офиса (адрес, название сайта и т. Д.)
- Сотрудники: модель для сотрудника (имя, адрес электронной почты и т. Д.)
У меня также есть ряд представлений, которые позволяют пользователю входить в систему, создавать и редактировать местоположения / сайты и т. Д.
То, что я хочу знать, является ли наилучшей практикой ограничивать редактирование экземпляров модели теми, которые создал пользователь? Например, без изменений два пользователя могут создавать данные, и оба могут редактировать других. Как мне ограничить это редактированием самостоятельно?
Я знаю, что длинный путь - это поставить ForeignKey(User)
на каждой модели, чтобы ограничить вид с queryset
, но это кажется длительным и громоздким. Есть ли трюк с Джанго, которого мне не хватает? Возможно, декоратор?
Какая лучшая практика?
1 ответ
Самый простой способ - отредактировать ваши модели так, чтобы они имели owner
или же user
поле, которое является ForeignKey
создателю.
class Locations(models.Model):
owner = ForeignKey(User)
...
И по вашему мнению:
def edit_location(request, location_id):
location = Locations.objects.get(pk=location_id)
if request.user is not location.owner:
# return a 401 or redirect to somewhere
else:
# do stuff
Вы можете использовать Джанго ManyToManyField
вариант, если каждый Location
а также User
может иметь несколько отношений. Например:
class Locations(models.Model):
owners = models.ManyToManyField(User)
user = User.objects.create(username='Ian')
location = Locations.objects.create(...)
location.owners.add(user)
А потом User
/ Locations
доступны на обоих:
>>> location.owners.all()
[<User: Ian>]
>>> user.locations_set.all()
[<Locations: ...>]
Набор на User
будет создан автоматически и будет назван <Model Name>_set
,
Затем вы можете использовать in
Оператор проверяет право собственности:
def edit_location(request, location_id):
location = Locations.objects.get(pk=location_id)
if request.user in location.owners.all():
# return a 401 or redirect to somewhere
else:
# do stuff