Django Class Based View - Generic detail View должен вызываться с объектом pk или slug в URLconf
Итак, у меня есть программа, которая принимает вошедшего в систему пользователя и обновляет изображение его профиля. Изначально у меня был вид, основанный на функциях, и шаблон, соответствующий url (url для доступа к профилю и, соответственно, его редактирования - localhost:8000/profile)
#views.py
@login_required
def profile(request):
if request.method=="POST":
u_form=UserUpdateForm(request.POST, instance=request.user)
p_form=ProfileUpdateForm(request.POST, request.FILES, instance=request.user.profile)
if u_form.is_valid() and p_form.is_valid():
u_form.save()
p_form.save()
messages.success(request, "Your account has been updated!")
return redirect('profile')
else:
u_form=UserUpdateForm(instance=request.user)
p_form=ProfileUpdateForm(instance=request.user.profile)
context={'u_form':u_form, 'p_form':p_form}
return render(request, 'users/profile.html', context)
#following line in URLpatterns of urls.py
path('profile/', user_views.ProfileUpdateView.as_view(), name='profile'),
Все работало нормально. Однако когда я попытался изменить его на представление на основе класса, как показано ниже, он начал выдавать ошибки
#views.py
class ProfileUpdateView(UpdateView):
model=Profile
fields=['image']
Случай 1: У меня было вот это в urls.py URLpatterns
path('profile/', user_views.ProfileUpdateView.as_view(), name='profile'),
Выдает ошибку -
(https://i.stack.imgur.com/6mXfI.png)](https://i.stack.imgur.com/6mXfI.png) Я не понимаю, почему выскакивает эта ошибка, ведь нет ID конкретной страницы, например profile/1, profile/2 - только profile/, потому что пользователь автоматически идентифицируется по тому, кто в данный момент вошел в систему, следовательно, нет необходимости передавать отдельный параметр в url
Случай 2: после того как я добавил параметр pk
path('profile/<int:pk>/', user_views.ProfileUpdateView.as_view(), name='profile'),
Выскакивает эта ошибка (https://i.stack.imgur.com/Op9eQ.png)](https://i.stack.imgur.com/Op9eQ.png)
Я застрял уже на целый день. Я просмотрел документацию Django, а также документацию MDN. Все еще не могу понять
Насколько я могу понять, Profile
- это модель, связанная с user
.
Если Profile
находится в OneToOneField
с User
, то в вашем представлении, основанном на классе, оверрайдите метод get_object
как:
def get_object(queryset=None,**kwargs):
return self.request.user.profile
Если ваш Profile
связан с ForeignKey
на User
, то ваш метод get_object
изменится на:
def get_object(queryset=None,**kwargs):
return Profile.objects.get(user=self.request.user)
В вашем классе переопределите метод get_object
как:
def get_object(self, **kwargs):
return Profile.objects.get(id=kwargs["int"])