Переопределение метода get() в Django UpdateView дает ‘str’ не имеет атрибута get ошибка

#python #django

#python #django

Вопрос:

У меня есть модель статистики, которая связана с пользовательской моделью Django с полем OneToOne. У меня есть UpdateView:

 class StatsUpdateView(UpdateView):
    model = Stats
    fields = ('stat1', 'stat2', 'stat3')
 

Это работает нормально, но любому пользователю разрешено изменять статистику, связанную с любым пользователем, я хочу, чтобы пользователь обновлял только статистику, связанную с ним.
Поэтому я переопределяю метод get () в StatsUpdateView следующим образом:

 def get(self, *args, **kwargs):
        if self.request.user != Stats.objects.get(pk=kwargs['pk']).user:  #checks if the user logged in is the same user related to the Stats with the onetoone field. Works fine.
            return redirect('homepage:home')
        else:  # if the user match, he can access the update view for his own stats
            print('user match')
            return reverse('user:updatestats', kwargs={'pk': kwargs['pk']})
 

Код работает нормально, пока оператор else ‘user match’ не будет напечатан в консоли, но я получаю эту ошибку при запуске сервера:
объект ‘str’ не имеет атрибута ‘get’

Вот путь:

 path('updatestats/<int:pk>/', StatisticheUpdateView.as_view(), name='updatestats')
 

РЕДАКТИРОВАТЬ полный возврат:

 Traceback (most recent call last):
  File "C:UsersscalfarinoPycharmProjectsopenyourmind2.0venvlibsite-packagesdjangocorehandlersexceptio
n.py", line 47, in inner
    response = get_response(request)
  File "C:UsersscalfarinoPycharmProjectsopenyourmind2.0venvlibsite-packagesdjangoutilsdeprecation.py",
 line 116, in __call__
    response = self.process_response(request, response)
  File "C:UsersscalfarinoPycharmProjectsopenyourmind2.0venvlibsite-packagesdjangomiddlewareclickjackin
g.py", line 26, in process_response
    if response.get('X-Frame-Options') is not None:
AttributeError: 'str' object has no attribute 'get'
 

Комментарии:

1. Привет @ CCima — я думаю, что вам нужно будет добавить больше информации, чтобы люди могли вам помочь — можете ли вы предоставить полное сообщение об отладке Django?

2. используйте DRF , введите страницу разрешений и прочитайте

Ответ №1:

Почему бы не использовать представление функции, подобное этому:

 def update_stats(request, pk):
    stats= get_object_or_404(Stats, pk=pk)
    if request.user == stats.user:
        form = StatsForm(request.POST or None)  # just make a form as you need
        if form.is_valid():
            stats.stat1= form.cleaned_data.get('stat1')
            # etc
            stats.save()
            return redirect('/yoururl')
        context = {'form': form}
        return render(request, 'update.html', context)  # render your template
     else:
         return redirect('homepage:home')
 

Ответ №2:

попробуйте это

используйте HttpResponseRedirect

 from django.http import HttpResponseRedirect
return HttpResponseRedirect(reverse('user:updatestats', kwargs={'pk': kwargs['pk']}))
 

https://docs.djangoproject.com/en/3.1/ref/request-response/#django.http .HttpResponseRedirect

Комментарии:

1. Даже с параметром запроса я получаю тот же вывод и ошибку, также я уже могу получить доступ к запросу с помощью self.request

2. теперь выдает ошибку ‘Toomanyredirects’, причина, по которой я использую reverse () вместо перенаправления, заключается в том, чтобы избежать этой ошибки

3. попробуйте перенаправить вместо HttpResponseRedirect

4. Это был мой первый вариант, выдает ошибку TOO_MANY_REDIRECTS

5. Обновление, использование перенаправления перенаправляет представление на себя в бесконечном цикле, ‘user match’ печатается в консоли много раз до сбоя сервера