Как лучше всего ограничивать права пользователей при редактировании экземпляров модели

Я строю простое приложение с использованием аутентификации пользователя.

Мое приложение имеет 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
Другие вопросы по тегам