Django удалить и обновить представление только для владельца

Я пишу задачу для своего университета в Django. В моем представлении обновления и удаления я хочу убедиться, что только владелец объекта может обновить / удалить его. Теперь это может сделать каждый.

Вот просмотры:

class UpdateCar(SuccessMessageMixin, UpdateView):
    model = Car
    form_class = AddNewCarForm
    template_name = 'c2crental/car/update_car.html'
    success_url = reverse_lazy('c2crental:list_user_cars')
    success_message = _("Car has been updated.")

    def get_queryset(self):
        owner = self.request.user
        return self.model.objects.filter(owner=owner)


class DeleteCar(DeleteView):
    model = Car
    success_url = reverse_lazy('c2crental:list_user_cars')
    template_name = 'c2crental/car/delete_confirm_car.html'
    success_message = _("Car has been deleted.")

    def delete(self, request, *args, **kwargs):
        messages.success(self.request, self.success_message)
        return super(DeleteCar, self).delete(request, *args, **kwargs)

    def get_queryset(self):
        owner = self.request.user
        return self.model.objects.filter(owner=owner)

Я нашел несколько решений с наборами запросов, как показано выше. Они не позволят другим пользователям обновлять / удалять объект и вызывать ошибку Http404, что нормально, но я хочу использовать структуру сообщений Django для печати сообщения об ошибке на странице и не перенаправлять на страницу Http404. Как я могу это сделать?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
323
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это, переопределив методы dispatch или get_object в ваших представлениях.

Как вы увидите, если get_object не находит объект, он выдает 404, поэтому, если вы не соответствуете владельцу, вы можете выбросить 403 или 404.

def get_object(self, queryset=None):
    """
    Check the logged in user is the owner of the object or 404
    """
    obj = super(MyView, self).get_object(queryset)
    if obj.owner != self.request.user:
        raise Http404(
            _("You don't own this object")
        )
    return obj

Понятно, но как я могу распечатать сообщение Http404, используя сообщения Django в качестве ошибки, вместо перенаправления на новую страницу?

Dombi 20.04.2018 13:50

Что ж, вы бы не хотели оставаться на странице, если кто-то наверняка не авторизован? Просто добавьте messages.error(self.request, self.error_message) перед raise, чтобы добавить сообщение к запросу.

markwalker_ 20.04.2018 13:55

Другие вопросы по теме