Метод save

Метод save применяется к экземпляру ModelForm и сохраняет данные формы в базу данных. Он возвращает сохраненный объект модели. Метод автоматически создает или обновляет запись в зависимости от того, передан ли аргумент ModelForm/attribute/instance/">instance при создании формы. Основные параметры метода: commit - определяет, нужно ли сразу сохранять объект в базу данных, и force_insert, force_update - принудительно задают тип операции.

Синтаксис

pythonform.save(commit=True, force_insert=False, force_update=False)

Пример . Модель и форма

Для начала создадим модель статьи и соответствующую форму:

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

Пример . Создание новой записи

Создадим новую статью с использованием формы:

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

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

python"Django Tutorial"
1

Пример . Обновление существующей записи

Обновим существующую статью, передав экземпляр модели в параметр instance:

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

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

python"Updated Django Tutorial"
1

Пример . Использование параметра commit

Используем параметр commit для отложенного сохранения, например, для дополнительной обработки данных:

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

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

python"Django Forms"
"published"

Пример . Работа с ManyToManyField

При работе с полями типа ManyToManyField метод save обрабатывает связи после сохранения основной записи:

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

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

python"Advanced Django"
[<Category: Python>, <Category: Web>, <Category: Django>]

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

  • класс ModelForm,
    который создает форму на основе модели
  • атрибут instance,
    который хранит экземпляр модели, связанный с формой
  • метод is_valid,
    который проверяет валидность данных формы
  • атрибут cleaned_data,
    который содержит очищенные и валидированные данные формы