'django UpdateView get_success_url not returning to profile page

I am still new to django and have encountered this issue, the situation is like this, I have a profile model, on which I have 2 views ViewProfile and EditProfile inheriting from DetailView and UpdateView respectively. when I edit the profile page, it doesn't get me to the profile page instead it gave the error:

Reverse for 'profile' with keyword arguments '{'id': 9}' not found. 1 pattern(s) tried: ['profile/(?P<pk>[^/]+)/\\Z']

even though I have checked in the python shell, the profile with id:9 is indeed profile with name muham see below

>>> Profile.objects.all()
<QuerySet [<Profile: huzaifa>, <Profile: another1>, <Profile: muham>]>
>>> p1 = Profile.objects.get(name='muham')
>>> p1.id
9
>>> 

but still its not showing, I have overridden the get_success_url to get me to the profile page:

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})  

my model is below:

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)


class ViewProfile(LoginRequiredMixin, DetailView):
    model = Profile
    template_name = 'blog_app/profile.html'
    context_object_name = 'profile'

urls.py:

urlpatterns = [
    path('', ListBlog.as_view(), name='home'),
    path('my-blogs/', MyBlog.as_view(), name='my-blogs'),
    path('create-blog/', CreateBlog.as_view(), name='blog-create'),
    path('blog-detail/<int:pk>/', BlogDetail.as_view(), name='blog-detail'),
    path('edit-blog/<int:pk>/', EditBlog.as_view(), name='blog-edit'),
    path('delete-blog/<int:pk>/', DeleteBlog.as_view(), name='blog-delete'),
    path('profile/<str:pk>/', ViewProfile.as_view(), name='profile'),
    path('edit-profile/<str:pk>/', EditProfile.as_view(), name='edit-profile'),
]   


Solution 1:[1]

I have found my error, it was because DetailView uses pk or slug, on the urlconf arguments, and before i have added str:id instead of str:pk, and also in the

def get_success_url(self):
    id = self.request.user.profile.id
    return reverse_lazy('profile', kwargs={'id': id})  

i had kwargs={'id':id} instead of {"pk": id}. so that was my issue, and it was resolved after that.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Muhammad huzaifa