#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’ печатается в консоли много раз до сбоя сервера