Я пишу задачу для своего университета в 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. Как я могу это сделать?






Вы можете сделать это, переопределив методы 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
Что ж, вы бы не хотели оставаться на странице, если кто-то наверняка не авторизован? Просто добавьте messages.error(self.request, self.error_message) перед raise, чтобы добавить сообщение к запросу.
Понятно, но как я могу распечатать сообщение Http404, используя сообщения Django в качестве ошибки, вместо перенаправления на новую страницу?