python - django 管理更改列表中的自定义 list_editable 字段,它不直接对应于模型字段

标签 python django django-admin

假设我的模型是这样的(这是一个简化的例子):

class Person(Model):
  first_name = CharField(...)
  last_name = CharField(...)

  def name():
    return first_name + ' ' + last_name

在管理更改列表中将名称显示为单列非常简单。但是,我需要一个可从列表页面编辑的单个可编辑“名称”字段,然后我可以对其进行解析以提取和设置模型字段值。解析不是问题。我只是想知道如何在列表页面上有一个不直接对应于模型字段的可编辑表单字段。

最佳答案

您应该能够通过一些工作在纯 Python 中执行此操作。基本上,您需要使用 get_changelist_form管理类上的方法告诉它为您的实例使用自定义表单而不是默认的 ModelForm,然后正确初始化自定义字段的值(最方便的是在表单的 __init__方法) 并专门化该表单的 save 行为以设置 first_namelast_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 值,当作为 bool 值测试时,该值的计算结果为 True - 如果 list_editable 未评估为 True

如果您没有其他想要编辑的字段,这会变得更加复杂。类验证要求 list_editable 序列中的所有内容都是在 list_display 中声明的可编辑字段,而不是显示链接字段。我认为这些选项要么覆盖管理类的 changelist_view 方法以使用完整处理,即使 list_editable 不是真的,要么定义 的自定义子类listtuple 计算结果为 True,即使为空也可以通过验证。前者需要重复大量标准代码,如果升级会显着增加维护负担,而后者是一种违反直觉的 hack,如果它产生意想不到的后果,我一点也不会感到惊讶。

这两个都不是好的选择,所以我希望您至少有一个有意义的其他字段可以包含在 list_editable 中。

关于python - django 管理更改列表中的自定义 list_editable 字段,它不直接对应于模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19233551/

相关文章:

python - 如何在网络服务器上上传图像。 Django

python - 在缺失的索引上连接两个 DataFrame

python - 快速选择行,其中至少 N 许多列在 numpy/scipy 中成立

django - 我们如何在 django 管理搜索字段中搜索多对多字段

Django表格内联显示

python - 我实现的 Bowyer-Watson Delaunay 三角剖分不会删除包含超三角形点的三角形

javascript - Django:我可以将 "action="和 jQuery 分配给同一个表单吗?

python - 如何使用 Django 对象显示 SVG?

django - 如何在 django 中启用 SSL 电子邮件?

python - Django相关模型未更新管理中的相关对象