假设以下模型
# 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不是所需行为的字段。