Валидация в Django, через форму, сравнение полей, перед сохранением объекта
Допустим в нашей админке при создании нового объекта необходимо произвести такую проверку
чтобы сохранение формы было возможно, только в том случае если значение поля field1
будет больше значения поля field2, иначе нужно чтобы форма не прошла валидацию, и об этом мы получили соответствущее уведомление прямо в админке сайта, как если бы пытались сохранить невалидные данные в каком либо из полей.
Для этого нам нужно в файле models.py:
☯
Terminal:
⌕
≡
✕
#Создать пользовательский метод clean который будет выбрасывать исключение при соблюдении определённого условия
#Для этого сначала импортируем
from django.core.exceptions import ValidationError from django.db import models class MyModel(models.Model): field1 = models.IntegerField() field2 = models.IntegerField() #добавлем метод выбрасывающий исключение по условию, который мы будем вызывать из файла admin.py def clean(self): if self.field1 <= self.field2: raise ValidationError("Field 1 must be less than Field 2.")
содержимое файла forms.py
☯
Terminal:
⌕
≡
✕
from django import forms from .models import MyModel class MyModelForm(forms.ModelForm): # Define your form fields here class Meta: model = MyModel fields = '__all__' # Or specify the fields you want to include
содержимое файла admin.py
☯
Terminal:
⌕
≡
✕
from django.contrib import admin from .forms import MyModelForm from .models import MyModel class MyModelAdmin(admin.ModelAdmin): form = MyModelForm def save_model(self, request, obj, form, change): obj.clean() # Validate the model instance super().save_model(request, obj, form, change) # Save the model instance admin.site.register(MyModel, MyModelAdmin)
Итак, что мы сделали в итоге: в admin.py мы импортируем форму и модель MyModelForm и MyModel из файлов forms.py и models.py соответственно. Далее, мы определяем собственный класс MyModelAdmin, который наследуется от admin.ModelAdmin, и связываем форму с моделью, используя form = MyModelForm.
Внутри класса MyModelAdmin мы переопределяем существующий метод save_model(). Но перед этим, мы вызываем свой собственный метод obj.clean() для проверки экземпляра модели. Это вызовет метод clean(), который мы определили в модели, и выбросит исключение ValidationError, если нужное условие не выполняется.
Если же экземпляр проходит проверку, мы просто вызываем super().save_model(request, obj, form, change) для сохранения экземпляра модели. Это будет обрабатывать стандартный процесс сохранения, предоставляемый интерфейсом администратора Django.
Реализуя логику проверки в методе clean() модели и переопределяя метод save_model() в классе ModelAdmin, вы можете убедиться, что модель проверяется на достоверность перед ее сохранением через интерфейс администратора Django.
-
- Roman Sakhno
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.