Django UpdateView get_success_url не возвращается на страницу профиля
Я еще новичок в django и столкнулся с этой проблемой, ситуация такая, у меня есть модель профиля, на которой есть 2 представления ViewProfile и EditProfile, наследующие от DetailView и UpdateView соответственно. когда я редактирую страницу профиля, она не переводит меня на страницу профиля, вместо этого она выдает ошибку:
Reverse for 'profile' with keyword arguments '{'id': 9}' not found. 1 pattern(s) tried: ['profile/(?P<pk>[^/]+)/\\Z']
хотя я проверил в оболочке python, профиль с id:9 действительно является профилем с именем muham см. ниже
>>> Profile.objects.all()
<QuerySet [<Profile: huzaifa>, <Profile: another1>, <Profile: muham>]>
>>> p1 = Profile.objects.get(name='muham')
>>> p1.id
9
>>>
но он все равно не отображается, Я переопределил get_success_url, чтобы перевести меня на страницу профиля:
class EditProfile(LoginRequiredMixin, UpdateView):
model = Profile
fields = ('name', 'address', 'phone_no',)
template_name = 'blog_app/edit_profile.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['user'] = self.request.user
return context
def get_success_url(self):
id = self.request.user.profile.id
return reverse_lazy('profile', kwargs={'id': id})
Моя модель ниже:
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=60, blank=True, null=True)
address = models.CharField(max_length=400, null=True, blank=True)
# image
phone_no = models.CharField(max_length=40, null=True, blank=True)
def __str__(self):
return str(self.user)
Я нашел свою ошибку, это было потому, что DetailView использует pk или slug, в аргументах urlconf, и прежде я добавил str:id вместо str:pk, и также в
def get_success_url(self):
id = self.request.user.profile.id
return reverse_lazy('profile', kwargs={'id': id})
у меня было kwargs={'id':id} вместо {"pk": id}. так что это была моя проблема, и она была решена после этого.