Как использовать представление на основе функций Django для обновления модели?

Я использовал представление на основе класса для обновления профиля пользователя с помощью этого кода

class EditProfileViewClass(generic.UpdateView):
    model = UserProfile
    fields = ['bio', 'profile pic']
    template_name = 'users/update.html'
    success_url = reverse_lazy('home')

path('profile/<int:pk>/update', EditProfileViewClass.as_view(), name="profile"),

<a href="{% url 'profile' user.id %}">Your Profile</a>

проблема сейчас в том, что вместо того, чтобы иметь url, как указано выше, я хочу, чтобы он был как

path('profile/<str:username>/update', EditProfileViewClass.as_view(), name="profile"),

но, к сожалению, я получаю ошибку атрибута, говорящую:

Generic detail view EditProfileView must be called with either an object pk or a slug in the URLconf.

Попробовал сделать представление на основе функции, чтобы получить "имя пользователя" из url, но это не позволило мне получить форму, необходимую для обновления конкретного имени пользователя.

Любая помощь была бы очень кстати. Спасибо.

В представлении EditProfileViewClass вы можете добавить pk_url_kwarg или slug_url_kwarg.

class EditProfileViewClass(UpdateView):
    model = UserProfile
    fields = ['bio', 'profile pic']
    template_name = 'users/update.html'
    success_url = reverse_lazy('home')
    pk_url_kwarg = 'username'
    slug_url_kwarg = 'username'

Вы можете использовать представление на основе классов, вам нужно только обновить slug_field (который определяет, что должно использоваться), и slug_url_kwargs:

class EditProfileViewClass(UpdateView):
    model = UserProfile
    fields = ['bio', 'profile_pic']
    template_name = 'users/update.html'
    success_url = reverse_lazy('home')
    slug_field = 'user__username'
    slug_url_kwarg = 'username'

Таким образом, он будет принимать параметр URL username и фильтровать набор запросов, чтобы получить только UserProfile, который связан с user с этим username.

Вернуться на верх