Класс CreateView

Класс CreateView наследуется от SingleObjectMixin и FormView, объединяя их функциональность для удобного создания объектов. При GET-запросе представление отображает пустую форму для заполнения. При POST-запросе с валидными данными форма сохраняется, и пользователь перенаправляется на указанный URL. Для работы с представлением необходимо определить модель или указать класс формы, а также задать список полей, которые будут включены в форму. Важным атрибутом является fields, который определяет, какие поля модели будут отображаться в форме создания.

Синтаксис

pythonfrom django.views.generic.edit import CreateView
from .models import Article

class ArticleCreateView(CreateView):
  model = Article
  fields = ['title', 'content', 'status']
  template_name = 'article_create.html'
  success_url = '/articles/'

Параметры

Основные атрибуты класса CreateView:

Пример

Создадим представление для добавления новой статьи:

pythonfrom django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .models import Article

class ArticleCreateView(CreateView):
  model = Article
  fields = ['title', 'content', 'author']
  template_name = 'articles/create.html'
  success_url = reverse_lazy('articles_list')

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

python"Redirects to /articles/ after successful creation"

Пример

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

pythonfrom django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .forms import ArticleForm
from .models import Article

class ArticleCreateView(CreateView):
  model = Article
  form_class = ArticleForm
  template_name = 'articles/create.html'
  success_url = reverse_lazy('articles_list')

  def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['page_title'] = 'Create New Article'
    return context

  def form_valid(self, form):
    form.instance.author = self.request.user
    return super().form_valid(form)

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

python"Article created with author set to current user"

Пример

Использование CreateView с моделью, содержащей связи ManyToMany:

pythonfrom django.views.generic.edit import CreateView
from django.urls import reverse_lazy
from .models import Post, Category

class PostCreateView(CreateView):
  model = Post
  fields = ['title', 'content', 'categories']
  template_name = 'posts/create.html'
  success_url = reverse_lazy('posts_list')

  def form_valid(self, form):
    response = super().form_valid(form)
    self.object.categories.set(form.cleaned_data['categories'])
    return response

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

python"Post created with selected categories"

Пример

Переопределение метода get_success_url для динамического определения URL после создания объекта:

pythonfrom django.views.generic.edit import CreateView
from django.urls import reverse
from .models import Product

class ProductCreateView(CreateView):
  model = Product
  fields = ['name', 'price', 'category']
  template_name = 'products/create.html'

  def get_success_url(self):
    return reverse('product_detail', kwargs={'pk': self.object.pk})

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

python"Redirects to product detail page after creation"

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

  • класс UpdateView,
    который используется для редактирования существующих объектов
  • класс DeleteView,
    который предназначен для удаления объектов
  • класс FormView,
    который является базовым классом для форм
  • класс ListView,
    который используется для вывода списка объектов