Метод save
Метод save применяется к экземпляру ModelForm и сохраняет данные формы в базу данных. Он возвращает сохраненный объект модели. Метод автоматически создает или обновляет запись в зависимости от того, передан ли аргумент ModelForm/attribute/instance/">instance при создании формы. Основные параметры метода: commit - определяет, нужно ли сразу сохранять объект в базу данных, и force_insert, force_update - принудительно задают тип операции.
Синтаксис
form.save(commit=True, force_insert=False, force_update=False)
Пример . Модель и форма
Для начала создадим модель статьи и соответствующую форму:
from django.db import models
from django.forms import ModelForm
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=20)
class ArticleForm(ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'status']
Пример . Создание новой записи
Создадим новую статью с использованием формы:
from myapp.forms import ArticleForm
data = {
'title': 'Django Tutorial',
'content': 'Django is a high-level Python web framework.',
'status': 'published'
}
form = ArticleForm(data)
if form.is_valid():
article = form.save()
print(article.title)
print(article.id)
Результат выполнения кода:
"Django Tutorial"
1
Пример . Обновление существующей записи
Обновим существующую статью, передав экземпляр модели в параметр instance:
from myapp.forms import ArticleForm
from myapp.models import Article
article = Article.objects.get(id=1)
data = {
'title': 'Updated Django Tutorial',
'content': 'Django is a high-level Python web framework.',
'status': 'published'
}
form = ArticleForm(data, instance=article)
if form.is_valid():
updated_article = form.save()
print(updated_article.title)
print(updated_article.id)
Результат выполнения кода:
"Updated Django Tutorial"
1
Пример . Использование параметра commit
Используем параметр commit для отложенного сохранения, например, для дополнительной обработки данных:
from myapp.forms import ArticleForm
data = {
'title': 'Django Forms',
'content': 'Working with Django forms.',
'status': 'draft'
}
form = ArticleForm(data)
if form.is_valid():
article = form.save(commit=False)
article.status = 'published'
article.save()
print(article.title)
print(article.status)
Результат выполнения кода:
"Django Forms"
"published"
Пример . Работа с ManyToManyField
При работе с полями типа ManyToManyField метод save обрабатывает связи после сохранения основной записи:
from django.db import models
from django.forms import ModelForm
class Category(models.Model):
name = models.CharField(max_length=50)
class ArticleWithCategories(models.Model):
title = models.CharField(max_length=100)
categories = models.ManyToManyField(Category)
class ArticleWithCategoriesForm(ModelForm):
class Meta:
model = ArticleWithCategories
fields = ['title', 'categories']
# Использование формы
data = {'title': 'Advanced Django'}
category_ids = [1, 2, 3]
form = ArticleWithCategoriesForm(data)
if form.is_valid():
article = form.save(commit=False)
article.save()
form.save_m2m()
print(article.title)
print(article.categories.all())
Результат выполнения кода:
"Advanced Django"
[<Category: Python>, <Category: Web>, <Category: Django>]
Смотрите также
-
класс
ModelForm,
который создает форму на основе модели -
атрибут
instance,
который хранит экземпляр модели, связанный с формой -
метод
is_valid,
который проверяет валидность данных формы -
атрибут
cleaned_data,
который содержит очищенные и валидированные данные формы