Джанго разрешить взаимодействие только с данными пользователя - PullRequest
0 голосов
/ 14 марта 2019

Я добавляю некоторое поведение профиля пользователя в приложение Django, и, как обычно, я хотел бы ограничить возможность пользователей взаимодействовать только с их собственными данными.Эти вопросы и ответы относятся к самому процессу:

Django --- Разрешение пользователям редактировать только свой профиль

Достаточно ли добавить аутентифицированный идентификатор пользователя всоздавать, обновлять и удалять запросы?Чтобы уменьшить дублирование кода, я подумал, что мог бы написать миксин, который переопределил бы get_object или get_queryset и перехватил бы запрос, добавив self.request.user.pk для фильтрации результатов?

Существуют ли другие эффективные методыдля этого или миксины из самого Django?

edit Это то, о чем я думал:

    class OwnersDataOnlyViewMixin(object):
    def get_object(self, queryset=None):
        if self.model == get_user_model():
            # user model, so pk of model should match self.request.user.pk
            return super().get_object(self.model.objects.filter(pk=self.request.user.pk))
        else:
            # different model
            try:
                # check for the 'user' field and filter on it if found
                user_field = self.model._meta.get_field('user')
                return super().get_object(self.model.objects.filter(user=self.request.user))
            except:
                # Mixin was used with model data not associated with a user
                raise self.model.DoesNotExist      

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

1 Ответ

1 голос
/ 14 марта 2019

Для представлений на основе классов вам, скорее всего, потребуется переопределить метод get_querset(), поскольку возвращаемый им набор запросов будет использоваться для получения данных для редактирования и удаления, поэтому возвращайте что-то вроде MyModel.objects.filter(owner=self.request.user),Обратите внимание, что это приведет к ответу 404 - «Не найдено», если пользователь пытается получить доступ к объекту, который ему не принадлежит.

При создании новых объектов вам в основном нужно будет установить request.user как владелец вновь созданного объекта.Это можно сделать, настроив метод CreateView form_valid():

class MyCreateView(LoginRequiredMixin, generic.CreateView):

    def form_valid(self, form):
        form.instance.owner = self.request.user
        return super().form_valid(form)

В зависимости от структуры вашей модели вы можете добавить эти методы в миксин и использовать их с общими представлениями.

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