Класс ModelForm

Класс ModelForm позволяет автоматически создавать формы на основе существующих моделей Django. Он наследуется от класса Form и добавляет функциональность для работы с экземплярами моделей. При создании ModelForm вы указываете модель, на основе которой строится форма, и поля, которые должны быть включены. Класс автоматически генерирует соответствующие поля формы, учитывая типы полей модели, их валидаторы и другие атрибуты.

Основные параметры ModelForm:

Синтаксис

pythonfrom django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
  class Meta:
    model = Article
    fields = ['title', 'content', 'status']
    # или exclude = ['created_at']

Пример

Давайте создадим модель Article и форму для нее:

pythonfrom django.db import models

class Article(models.Model):
  title = models.CharField(max_length=100)
  content = models.TextField()
  status = models.CharField(max_length=20)
  created_at = models.DateTimeField(auto_now_add=True)

  def __str__(self):
    return self.title
pythonfrom django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
  class Meta:
    model = Article
    fields = ['title', 'content', 'status']

# Создание формы для новой записи
form = ArticleForm()
print(form.as_p())

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

python"<p><label for='id_title'>Title:</label> <input type='text' name='title' maxlength='100' required id='id_title'></p>
<p><label for='id_content'>Content:</label> <textarea name='content' cols='40' rows='10' required id='id_content'></textarea></p>
<p><label for='id_status'>Status:</label> <input type='text' name='status' maxlength='20' required id='id_status'></p>"

Пример

Теперь создадим форму для редактирования существующей статьи с использованием параметра instance:

pythonfrom myapp.models import Article
from myapp.forms import ArticleForm

# Получаем статью для редактирования
article = Article.objects.get(id=1)

# Создаем форму с экземпляром модели
form = ArticleForm(instance=article)
print(form.as_p())

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

python"<p><label for='id_title'>Title:</label> <input type='text' name='title' value='My Article' maxlength='100' required id='id_title'></p>
<p><label for='id_content'>Content:</label> <textarea name='content' cols='40' rows='10' required id='id_content'>Article content here</textarea></p>
<p><label for='id_status'>Status:</label> <input type='text' name='status' value='published' maxlength='20' required id='id_status'></p>"

Пример

Обработка данных, отправленных через форму, с использованием метода save:

pythonfrom myapp.forms import ArticleForm

# POST данные из запроса
post_data = {
  'title': 'New Article',
  'content': 'This is the content',
  'status': 'draft'
}

# Создаем связанную форму с данными
form = ArticleForm(post_data)

if form.is_valid():
  # Сохраняем новую статью в базу данных
  article = form.save()
  print(f"Article saved with id: {article.id}")
  print(f"Title: {article.title}")
else:
  print("Form is invalid")
  print(form.errors)

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

python"Article saved with id: 2"
"Title: New Article"

Пример

Обновление существующей записи с использованием параметра instance:

pythonfrom myapp.models import Article
from myapp.forms import ArticleForm

# Получаем статью для обновления
article = Article.objects.get(id=1)

# Данные для обновления
post_data = {
  'title': 'Updated Article',
  'content': 'Updated content',
  'status': 'published'
}

# Создаем форму с экземпляром и данными
form = ArticleForm(post_data, instance=article)

if form.is_valid():
  # Сохраняем изменения
  updated_article = form.save()
  print(f"Article updated: {updated_article.title}")
else:
  print("Form is invalid")
  print(form.errors)

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

python"Article updated: Updated Article"

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

  • класс Form,
    базовый класс для создания форм в Django
  • метод save,
    сохраняет данные формы в базу данных
  • атрибут instance,
    экземпляр модели, связанный с формой
  • метод is_valid,
    проверяет валидность данных формы