авторизация django в представлении на основе классов - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь ограничить доступ к страницам CRUD для владельцев, но я не могу найти представление на основе классов, эквивалентное "if request.user! = Post.author повышение Http404".Спасибо за ваше время.

models.py

class Article(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('article_detail', args=[str(self.id)])

views.py

class ArticleUpdateView(LoginRequiredMixin, UpdateView):
    model = Article
    fields = ['title', 'body']
    template_name = 'article_edit.html'
    login_url = 'login'

Я попробовал следующее (и многие другие комбинации вокруг этих строк), ноэто не работает.

def get(self, request, *args, **kwargs):
        if self.request.user == self.obj.author:
            raise Http404()

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы можете сделать что-то вроде этого: -

class ArticleUpdateView(LoginRequiredMixin, UpdateView):
    model = Article
    fields = ['title', 'body']
    template_name = 'article_edit.html'
    login_url = 'login'

    def get(self, request, *args, **kwargs):
        self.obj = self.get_object()
        if self.request.user != self.obj.author:
            raise Http404()
        return super(ArticleUpdateView, self).get(request, *args, **kwargs)
0 голосов
/ 20 ноября 2018

Я думаю, вы можете переопределить метод get_queryset для достижения этой цели. Например:

class ArticleUpdateView(...):

 def get_queryset(self):
    queryset = super(ArticleUpdateView, self).get_queryset()
    return queryset.filter(author = self.request.user)

Таким образом, когда пользователь пытается обновить сообщение, которое он не создал, он не сможет его получить, поскольку не сможет найти объект сообщения в Queryset, предоставленном методом get_queryset. Для получения более подробной информации, пожалуйста, SingleObjectMixin , который позже классифицируется в UpdateView. FYI вам не нужно переопределять метод get для этой реализации.

...