UpdateView — CBV для редактирования существующего объекта через форму.
Базовый пример
from django.views.generic import UpdateView
from django.urls import reverse_lazy
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Task
class TaskUpdateView(LoginRequiredMixin, UpdateView):
model = Task
fields = ['title', 'description', 'status', 'priority']
template_name = 'tasks/task_form.html'
success_url = reverse_lazy('task-list')
URL
path('tasks/<int:pk>/edit/', views.TaskUpdateView.as_view(), name='task-edit'),
Шаблон (тот же что у CreateView)
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Сохранить</button>
<a href="{% url 'task-list' %}">Отмена</a>
</form>
Проверка прав (только владелец)
class TaskUpdateView(LoginRequiredMixin, UpdateView):
model = Task
fields = ['title', 'description', 'status', 'priority']
def get_queryset(self):
return Task.objects.filter(owner=self.request.user)
def get_success_url(self):
return reverse('task-detail', kwargs={'pk': self.object.pk})
Дополнительная обработка при сохранении
class TaskUpdateView(SuccessMessageMixin, UpdateView):
model = Task
fields = ['title', 'status', 'priority']
success_message = 'Задача обновлена!'
def form_valid(self, form):
# Логируем изменение
logger.info(f'Task {self.object.pk} updated by {self.request.user}')
return super().form_valid(form)
Форма с кастомными полями
class TaskUpdateView(UpdateView):
model = Task
form_class = TaskUpdateForm # кастомная форма вместо fields
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['user'] = self.request.user # передать пользователя в форму
return kwargs
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!