你应该能够在纯 Python 中做一些工作。基本上,您需要使用get_changelist_form
管理类上的方法来告诉它使用自定义表单而不是ModelForm
实例的默认值,然后正确初始化自定义字段的值(最方便的是在表单的__init__
方法中)并专门save
化该表单的行为设置first_name
和last_name
值。
这样的事情应该是一个开始:
class PersonChangeListForm(forms.ModelForm):
class Meta:
model = Person
name = forms.CharField()
def __init__(self, *args, **kwargs):
instance = kwargs.get('instance')
if instance:
initial = kwargs.get('initial', {})
initial['name'] = '%s %s' % (instance.first_name, instance.last_name)
kwargs['initial'] = initial
super(PersonChangeListForm, self).__init__(*args, **kwargs)
def save(self, *args, **kwargs):
# use whatever parsing you like here
first_name, last_name = self.cleaned_data['name'].split(None, 1)
self.cleaned_data['first_name'] = first_name
self.cleaned_data['last_name'] = last_name
return super(PersonChangeListForm, self).save(*args, **kwargs)
class PersonAdmin(admin.ModelAdmin):
def get_changelist_form(self, request, **kwargs):
return PersonChangeListForm
您还需要声明一个在测试为布尔list_editable
值时评估为的值 - 如果不评估为 ,True
则某些管理员处理短路而不使用表单集。list_editable
True
如果您没有其他要编辑的字段,这将变得更加复杂。类验证要求list_editable
序列中的所有内容都是在其中声明的可编辑字段,list_display
而不是显示链接字段。我认为选项要么覆盖管理类的changelist_view
方法以使用完整处理,即使list_editable
不是真的,或者定义一个自定义子类list
ortuple
评估为True
即使是空的,这样它就可以通过验证。前者需要重复大量标准代码,如果升级的话,会显着增加维护负担,而后者是一种违反直觉的 hack,如果它产生意想不到的后果,我一点也不感到惊讶。
两者都不是好的选择,所以我希望您至少有一个其他领域可以包含在list_editable
.