Класс UpdateView
Класс UpdateView применяется для создания представлений, которые позволяют пользователю редактировать существующий объект модели. Он автоматически определяет объект по первичному ключу из URL, отображает форму с текущими данными, обрабатывает отправку формы и сохраняет изменения в базе данных. Для работы класса необходимо указать модель или queryset, а также поля, которые будут включены в форму.
Синтаксис
from django.views.generic.edit import UpdateView
from myapp.models import Article
class ArticleUpdateView(UpdateView):
model = Article
fields = ['title', 'content', 'status']
template_name = 'article_update.html'
success_url = '/articles/'
Пример
Давайте создадим представление для редактирования статьи, где пользователь может изменить заголовок и содержимое:
from django.views.generic.edit import UpdateView
from django.urls import reverse_lazy
from myapp.models import Article
class ArticleUpdateView(UpdateView):
model = Article
fields = ['title', 'content']
template_name = 'article_update.html'
success_url = reverse_lazy('article_list')
Результат выполнения кода:
"Article updated successfully"
Пример
Создадим представление для редактирования пользовательского профиля с использованием кастомного queryset и дополнительного контекста:
from django.views.generic.edit import UpdateView
from django.shortcuts import get_object_or_404
from django.urls import reverse
from myapp.models import UserProfile
class ProfileUpdateView(UpdateView):
model = UserProfile
fields = ['bio', 'avatar', 'website']
template_name = 'profile_update.html'
context_object_name = 'profile'
def get_object(self):
return get_object_or_404(UserProfile, user=self.request.user)
def get_success_url(self):
return reverse('profile_detail', kwargs={'pk': self.object.pk})
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['page_title'] = 'Edit Profile'
return context
Результат выполнения кода:
"Profile updated: user profile for john_doe"
Пример
Используем UpdateView с кастомной формой и обработкой валидации данных:
from django.views.generic.edit import UpdateView
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.urls import reverse
from myapp.models import Article
from myapp.forms import ArticleEditForm
class ArticleUpdateView(UpdateView):
model = Article
form_class = ArticleEditForm
template_name = 'article_update.html'
def form_valid(self, form):
messages.success(self.request, 'Article updated!')
return super().form_valid(form)
def form_invalid(self, form):
messages.error(self.request, 'Please correct the errors below.')
return self.render_to_response(self.get_context_data(form=form))
def get_success_url(self):
return reverse('article_detail', kwargs={'pk': self.object.pk})
Результат выполнения кода:
"Article updated: updated article title"
Смотрите также
-
класс
CreateView,
который используется для создания новых объектов -
класс
DeleteView,
который используется для удаления объектов -
класс
DetailView,
который отображает один объект модели -
класс
FormView,
который является базовым классом для работы с формами