Как использовать представление на основе функций 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
.