Bootstrap

Валидация в Django, через форму, сравнение полей, перед сохранением объекта

Валидация в 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 и индексируемой прямой ссылкой на сайт (http://itdid.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/sahroman.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/sahroman.

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как настроить свой компьютер

  2. Текстовая ссылка:

    Она выглядит вот так: Как настроить свой компьютер

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

крипто-донат, на развитие сайта itdid.ru:

В новом окне с терминалом itdid.ru, введите любую сумму: