Как разрешить только авторам записи редактировать ее в логике UpdateView - PullRequest
1 голос
/ 31 марта 2019

Вот проблема: у меня есть представление Обновления с переопределенным методом get_object:

class MyUpdateView(SuccessMessageMixin, LoginRequiredMixin, UpdateView):

some code here:

    def get_object(self, queryset=None):
        obj = UpdateView.get_object(self, queryset=None)
        if not obj.author == self.request.user:
            redirect(reverse_lazy("app:url")) # or reverse instead  , no difference
        return obj

p.s. object.author привязан через внешний ключ к пользовательской модели (в нашем случае self.request.user)

В этом представлении я хочу разрешить редактировать запись только тем пользователям, которые создали именно эту запись. Я знаю, как это сделать через get_queryset или через UserPassesTestMixin, но оба метода вызывают ошибки. Вместо этого мне нужно перенаправить пользователя, который не является автором, обратно на страницу, откуда он пришел, или на определенный URL (параметрический).

В этом случае (код ниже) работает нормально, появляется 404, так что логика работает. Я попробовал это через веб-сайт: автор может редактировать запись, а не автор вызвал 404.


# in this case it forks fine,  404 appears :

 def get_object(self, queryset=None):
        obj = UpdateView.get_object(self, queryset=None)
        if not obj.author == self.request.user:
            raise Http404
        return obj

Но в первом примере редирект по какой-то причине не работает.

Я пытался - get_queryset или UserPassesTestMixin, но это не то, что мне нужно

autor = request.user - разрешить редактировать запись

author! = Request.user - перейти на предыдущую страницу или на определенный URL + сообщение

Если у кого-то есть идеи, как использовать перенаправление в этом случае, пожалуйста, ответьте. Иметь день

--- решение ---


    def get(self, request, **kwargs):
        if self.get_object().author == self.request.user:
            return UpdateView.get(self, request, **kwargs)
        else:
            messages.add_message(request, messages.WARNING, "You can only change your own entries")
            return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

1 Ответ

3 голосов
/ 31 марта 2019

Вам нужно вернуться назад и , а затем уведомить пользователя с помощью сообщения, используя структуру сообщений django Правильный способ сделать это -

from django.http import HttpResponseRedirect

def someview(request):
   ...
   return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
...