Обновление булева поля из-за изменения другого поля в Django Admin

У меня есть модель Department типа:

class Department(models.Model):
    dep_title = models.CharField(max_length=30, verbose_name='Title')
    dep_description = models.CharField(max_length=100, blank=True, verbose_name='Description')
    dep_status = models.BooleanField(default=False, verbose_name='Is Active?')
    dep_start = models.DateField(verbose_name='Date of Establishment')
    dep_end = models.DateField(blank=True, verbose_name='Closing Date', null=True)

и DepartmentAdmin:

class DepartmentAdmin(admin.ModelAdmin):
    list_display= ('dep_title','dep_description','dep_status', 'dep_start', 'dep_end')

Я хочу проверить дату dep_end и если дата истекла, автоматически установить dep_status = False

Как я могу это реализовать?

Вы можете переопределить свою функцию сохранения. Например, так:

class Department(models.Model):
    dep_title = models.CharField(max_length=30, verbose_name='Title')
    dep_description = models.CharField(max_length=100, blank=True, verbose_name='Description')
    dep_status = models.BooleanField(default=False, verbose_name='Is Active?')
    dep_start = models.DateField(verbose_name='Date of Establishment')
    dep_end = models.DateField(blank=True, verbose_name='Closing Date', null=True)
    def save(self, *args, **kwargs):
        if self.dep_end > ## Expiration date here ##:
            self.dep_status = False
        super(Department, self).save(*args, **kwargs)

Теперь каждый раз, когда ваша модель сохраняется, она будет проверять, не закончилась ли дата dep_end на вашем сроке действия.

Вы также можете переопределить save_model в ModelAdmin как

from django.contrib import admin
from yourapp.models import Department

class DepartmentAdmin(admin.ModelAdmin):

    def save_model(self, request, obj, form, change):
        super().save_model(request, obj, form, change)
        if change and 'dep_end' in form.changed_data:
            if obj.dep_end < # your expiration date:
                obj.dep_status = False
            else:
                pass

admin.site.register(Department, DepartmentAdmin)

Подробнее Django-doc

Вернуться на верх