Django Проверка пользователя UpdateView не работает - PullRequest
1 голос
/ 27 мая 2020

Привет, ребята, у меня есть это представление обновления, в котором я не могу проверить пользователя (владельца). Как настроить это, чтобы добавить и этот бит? Взгляните на код.

class StoreInfoView(UpdateView, LoginRequiredMixin):
    model = Store
    template_name = 'store/store_information.html'
    form_class = StoreInfoForm
    success_message = 'Updated'
    success_url = reverse_lazy('store:store_home')

    def get_object(self, queryset=None):
        obj = Store.objects.get(id=self.kwargs['id'])
        if obj.user != self.request.user:
            raise PermissionDenied('You Don\'t have permission to edit!')
        return obj

    def get(self, *args, **kwargs):
        self.object = Store.objects.get(id=self.kwargs['id'])
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        context = self.get_context_data(object=self.object, form=form)
        return self.render_to_response(context)

Спасибо

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Вместо такого переопределения вы можете просто переопределить метод get_queryset(). Примерно так:

class StoreInfoView(UpdateView, LoginRequiredMixin):
    model = Store
    template_name = 'store/store_information.html'
    form_class = StoreInfoForm
    success_message = 'Updated'
    success_url = reverse_lazy('store:store_home')

    def get_queryset(self, *args, **kwargs):
        queryset = super().get_queryset(*args, **kwargs)
        return queryset.filter(user=self.request.user)

Таким образом, пользователи, не являющиеся собственниками, получат ошибку 404 при попытке обновления.

Кроме того, вам не нужно переопределять любые другие методы, такие как get() и get_object() метод.

0 голосов
/ 27 мая 2020

Проблема в вашей проблеме - это порядок наследования. Когда вы go через официальную документацию для LoginRequiredMixin, вы найдете это

Этот миксин должен находиться в самой левой позиции в списке наследования.

Пожалуйста, обновите свой код до этого

class StoreInfoView(LoginRequiredMixin, UpdateView):
    model = Store
    template_name = 'store/store_information.html'
    form_class = StoreInfoForm
    success_message = 'Updated'
    success_url = reverse_lazy('store:store_home')

    ...

Обратите внимание, теперь LoginRequiredMixin ставится перед UpdateView. Это должно решить ваш вопрос.

Надеюсь, это поможет. :)

...