Django管理界面的附加字段
假设我有一个持久化的模型属性,但这个属性并没有对应的模型字段,我该如何在管理界面中允许编辑这个字段呢?
下面是一个例子:
# 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 个回答
我对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
看看这个链接:
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 继承来的,然后:
- 在 MyModelFrom 的定义中添加额外的字段。
- 重写 MyModelFrom 的构造函数,如果有模型实例传给表单,就设置 self.initial 的额外字段。
- 重写 MyModelFrom 的保存方法,根据表单字段设置模型实例的额外字段。
这样一来,模型的额外字段就能正确填充了,但你还需要重写 MyModel 的 save() 方法,才能把这个值真正保存到你的文件里:
(可以在网上搜索“django model override save”,抱歉,我好像不能在回答中发超过一个链接,直到我获得超过10的声望...)
祝好,