Класс CreateView
Класс CreateView наследуется от SingleObjectMixin и FormView, объединяя их функциональность для удобного создания объектов. При GET-запросе представление отображает пустую форму для заполнения. При POST-запросе с валидными данными форма сохраняется, и пользователь перенаправляется на указанный URL. Для работы с представлением необходимо определить модель или указать класс формы, а также задать список полей, которые будут включены в форму. Важным атрибутом является fields, который определяет, какие поля модели будут отображаться в форме создания.
Синтаксис
from 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:
-
model- модель, для которой создается объект. -
fields- список полей модели, которые будут включены в форму. -
form_class- класс формы, если требуется кастомизация. -
template_name- шаблон для отображения формы. -
success_url- URL для перенаправления после успешного сохранения. -
context_object_name- имя переменной в контексте для объекта.
Пример
Создадим представление для добавления новой статьи:
from 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')
Результат выполнения кода:
"Redirects to /articles/ after successful creation"
Пример
Использование кастомной формы и переопределение метода для валидации:
from 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)
Результат выполнения кода:
"Article created with author set to current user"
Пример
Использование CreateView с моделью, содержащей связи ManyToMany:
from 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
Результат выполнения кода:
"Post created with selected categories"
Пример
Переопределение метода get_success_url для динамического определения URL после создания объекта:
from 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})
Результат выполнения кода:
"Redirects to product detail page after creation"
Смотрите также
-
класс
UpdateView,
который используется для редактирования существующих объектов -
класс
DeleteView,
который предназначен для удаления объектов -
класс
FormView,
который является базовым классом для форм -
класс
ListView,
который используется для вывода списка объектов