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