Django管理界面的附加字段

0 投票
2 回答
3072 浏览
提问于 2025-04-16 07:47

假设我有一个持久化的模型属性,但这个属性并没有对应的模型字段,我该如何在管理界面中允许编辑这个字段呢?

下面是一个例子:

# models.py

# appropriate imports...

class MyModel(Model):
      # regular fields.
    foo = CharField(max_length=50)
    bar = BooleanField()
    # ...

      # custom property, backed by a file.
    def _get_meh ( self ):
        return ... # read from file
    def _set_meh ( self, value ):
        ... # write to file.
    meh = property(_get_meh, _set_meh)

meh的值实际上是存储在一个文件中的,这个文件的路径是根据foo的值来决定的。我希望能够在管理界面中编辑meh的值。

# admin.py

# appropriate imports...

class MyModelAdmin(ModelAdmin):
    # what do I put here?

注意:如果有人需要问,我使用的是Django 1.2.1版本,但如果你的解决方案需要升级,我是可以考虑的。任何能在Python 2.5上运行的东西都可以,不过我目前确实不能升级。

2 个回答

1

我对Django的了解不是很深,但根据你想要的复杂程度,我不太确定像这样的事情能否轻松实现,而不需要很多小技巧。

不过,如果你想把它添加到“添加MyModel”页面,你可以编辑相应的管理模板。

所以在你的模板目录里,创建一个类似这样的文件:

admin/app_label/MyModel/change_form.html

然后扩展基础模板,添加你自己的内容:

{% extends "admin/change_form.html" %}

{% block something_you_want_to_override %}
    <p>Your HTML goes here</p>
{% endblock %}

不过,真的没有办法把这个自定义字段变成一个真正的Django字段吗?你肯定可以重写模型的save()方法来实现这个吧?或者使用pre_save信号?

祝好,
Victor

1

看看这个链接:

http://www.scribd.com/doc/68396387/Adding-extra-fields-to-a-model-form-in-Django%E2%80%99s-admin-%E2%80%93-Hindsight-Labs(这个链接已经失效了,http://www.hindsightlabs.com/blog/2010/02/11/adding-extra-fields-to-a-model-form-in-djangos-admin/

简单来说,你需要创建一个叫 MyModelFrom 的类,这个类是从 forms.ModelForm 继承来的,然后:

  1. 在 MyModelFrom 的定义中添加额外的字段。
  2. 重写 MyModelFrom 的构造函数,如果有模型实例传给表单,就设置 self.initial 的额外字段。
  3. 重写 MyModelFrom 的保存方法,根据表单字段设置模型实例的额外字段。

这样一来,模型的额外字段就能正确填充了,但你还需要重写 MyModel 的 save() 方法,才能把这个值真正保存到你的文件里:

(可以在网上搜索“django model override save”,抱歉,我好像不能在回答中发超过一个链接,直到我获得超过10的声望...)

祝好,

撰写回答