Метод has_changed
Метод has_changed применяется к полю формы и возвращает
True, если значение поля было изменено по сравнению
с начальными данными, и False в противном случае.
Метод полезен для определения того, какие поля были изменены
пользователем при отправке формы. Метод доступен как для
связанных, так и для несвязанных форм, но в несвязанных
формах всегда возвращает False.
Метод принимает два аргумента: имя поля, которое нужно
проверить, и словарь данных формы. Если второй аргумент
не передан, метод использует данные, переданные при инициализации
формы. Возвращаемое значение типа bool.
Синтаксис
form.has_changed(field_name, data=None)
Пример
Создадим форму для редактирования профиля пользователя и
проверим, изменилось ли поле 'username' после отправки:
from django import forms
class ProfileForm(forms.Form):
username = forms.CharField(max_length=100)
email = forms.EmailField()
age = forms.IntegerField(min_value=0)
initial_data = {
'username': 'john_doe',
'email': 'john@example.com',
'age': 30,
}
form = ProfileForm(initial=initial_data)
submitted_data = {
'username': 'john_doe_updated',
'email': 'john@example.com',
'age': 30,
}
form = ProfileForm(submitted_data, initial=initial_data)
form.is_valid()
res = form.has_changed('username')
print(res)
res = form.has_changed('email')
print(res)
Результат выполнения кода:
"True"
"False"
В этом примере поле 'username' было изменено,
поэтому метод вернул True, а поле 'email' осталось
без изменений, поэтому вернул False.
Пример
Рассмотрим использование метода has_changed
с модельной формой для проверки изменений в записи
базы данных:
from django import forms
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
status = models.CharField(max_length=20)
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content', 'status']
article = Article.objects.get(pk=1)
form = ArticleForm(instance=article)
submitted_data = {
'title': 'New title',
'content': article.content,
'status': article.status,
}
form = ArticleForm(submitted_data, instance=article)
form.is_valid()
res = form.has_changed('title')
print(res)
res = form.has_changed('content')
print(res)
res = form.has_changed('status')
print(res)
Результат выполнения кода:
"True"
"False"
"False"
Метод позволяет определить, что только поле
'title' было изменено, остальные поля остались
без изменений.
Пример
Метод has_changed можно использовать для
условной логики в обработчике формы, например,
для отправки уведомления только в случае изменения
определенных полей:
from django import forms
from django.db import models
class UserSettings(models.Model):
user = models.CharField(max_length=50)
email = models.EmailField()
notifications = models.BooleanField(default=True)
class SettingsForm(forms.ModelForm):
class Meta:
model = UserSettings
fields = ['user', 'email', 'notifications']
settings = UserSettings.objects.get(user='john_doe')
form = SettingsForm(instance=settings)
submitted_data = {
'user': settings.user,
'email': 'new_email@example.com',
'notifications': 'on',
}
form = SettingsForm(submitted_data, instance=settings)
form.is_valid()
if form.has_changed('email'):
print("Email was changed, send confirmation email")
if form.has_changed('notifications'):
print("Notification settings were changed")
if form.has_changed('user'):
print("Username was changed")
Результат выполнения кода:
"Email was changed, send confirmation email"
"Notification settings were changed"
В этом примере мы проверяем только изменилось ли
поле 'email' и 'notifications',
и выполняем соответствующие действия только для
измененных полей.
Смотрите также
-
атрибут
changed_data,
который возвращает список всех измененных полей -
метод
is_valid,
который проверяет валидность данных формы -
атрибут
initial,
который содержит начальные данные формы -
метод
save,
который сохраняет данные модели в базу данных