Предполагается, что следующая модель
# models.py
class Person(models.Model):
name = models.CharField(max_length=40)
birthdate = models.DateField()
age = models.CharField(max_length=3) # dont mind the type, this is just an example :)
Желаемым поведением будет скрытие поля age
, пока пользователь создает новый объект Person
, и оценка его значения, когда пользователь отправляетформа.Кроме того, поле age
должно быть видно при просмотре экземпляра объекта в admin.
Для этого я создал ModelAdmin
с пользовательским ModelForm
следующим образом
# admin.py
from django.contrib import admin
from django import forms
from .models import Person
from dateutil.relativedelta import relativedelta
import datetime
class PersonForm(forms.ModelForm):
def clean(self):
cleaned_data = super(PersonForm, self).clean()
birthdate = cleaned_data.get('birthdate')
cleaned_data['age'] = relativedelta(datetime.date.today(), birthdate).years
return cleaned_data
class PersonAdmin(admin.ModelAdmin):
form = PersonForm
exclude = ('age',)
admin.site.register(Person, PersonAdmin)
Однако после отправки формы поле age
не заполняется, возможно потому, что оно исключено.Если я удаляю exclude
, то он работает, но в форме отображается поле age
, которое не соответствует желаемому поведению.