Класс UpdateView

Класс UpdateView применяется для создания представлений, которые позволяют пользователю редактировать существующий объект модели. Он автоматически определяет объект по первичному ключу из URL, отображает форму с текущими данными, обрабатывает отправку формы и сохраняет изменения в базе данных. Для работы класса необходимо указать модель или queryset, а также поля, которые будут включены в форму.

Синтаксис

pythonfrom 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/'

Пример

Давайте создадим представление для редактирования статьи, где пользователь может изменить заголовок и содержимое:

pythonfrom 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')

Результат выполнения кода:

python"Article updated successfully"

Пример

Создадим представление для редактирования пользовательского профиля с использованием кастомного queryset и дополнительного контекста:

pythonfrom 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

Результат выполнения кода:

python"Profile updated: user profile for john_doe"

Пример

Используем UpdateView с кастомной формой и обработкой валидации данных:

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

Результат выполнения кода:

python"Article updated: updated article title"

Смотрите также

  • класс CreateView,
    который используется для создания новых объектов
  • класс DeleteView,
    который используется для удаления объектов
  • класс DetailView,
    который отображает один объект модели
  • класс FormView,
    который является базовым классом для работы с формами