Класс ModelForm
Класс ModelForm позволяет автоматически создавать формы на основе существующих моделей Django. Он наследуется от класса Form и добавляет функциональность для работы с экземплярами моделей. При создании ModelForm вы указываете модель, на основе которой строится форма, и поля, которые должны быть включены. Класс автоматически генерирует соответствующие поля формы, учитывая типы полей модели, их валидаторы и другие атрибуты.
Основные параметры ModelForm:
-
model- модель, на основе которой создается форма (обязательный параметр в Meta-классе); -
fields- список полей модели, которые должны быть включены в форму (обязательный параметр либо используйтеexclude); -
exclude- список полей модели, которые должны быть исключены из формы; -
instance- экземпляр модели, который используется для заполнения формы данными (передается при создании объекта формы); -
initial- словарь с начальными значениями полей формы.
Синтаксис
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'status']
# или exclude = ['created_at']
Пример
Давайте создадим модель Article и форму для нее:
from 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
from 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())
Результат выполнения кода:
"<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:
from myapp.models import Article
from myapp.forms import ArticleForm
# Получаем статью для редактирования
article = Article.objects.get(id=1)
# Создаем форму с экземпляром модели
form = ArticleForm(instance=article)
print(form.as_p())
Результат выполнения кода:
"<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:
from 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)
Результат выполнения кода:
"Article saved with id: 2"
"Title: New Article"
Пример
Обновление существующей записи с использованием параметра instance:
from 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)
Результат выполнения кода:
"Article updated: Updated Article"