我有一个模型Foo
。它具有多个数据库属性,以及基于多个因素组合计算的多个属性。我想将这些计算出的属性呈现给用户,就好像它们是数据库属性一样。 (支持因素将被更改以反映用户输入。)有没有办法使用Django管理界面执行此操作?
答案 0 :(得分:30)
我建议你为Foo
(FooAdminForm)子类化一个模型,以添加自己没有数据库支持的字段。您的自定义验证可以驻留在ModelForm的clean_*
方法中。
在save_model
的{{1}}方法中,您获得了请求,FooAdmin
的实例和表单数据,因此您可以在保存实例之前/之后对数据进行所有处理
以下是使用django admin注册的自定义表单的模型示例:
Foo
根据实例数据提供自定义字段的初始值
(我不确定这是否是最佳解决方案,但它应该有效。)
当构造数据库中现有模型实例的模型时,它将传递给该实例。因此,在FooAdminForm的from django import forms
from django.db import models
from django.contrib import admin
class Foo(models.Model):
name = models.CharField(max_length=30)
class FooAdminForm(forms.ModelForm):
# custom field not backed by database
calculated = forms.IntegerField()
class Meta:
model = Foo
class FooAdmin(admin.ModelAdmin):
# use the custom form instead of a generic modelform
form = FooAdminForm
# your own processing
def save_model(self, request, obj, form, change):
# for example:
obj.name = 'Foo #%d' % form.cleaned_data['calculated']
obj.save()
admin.site.register(Foo, FooAdmin)
中,可以根据实例数据更改字段属性。
__init__
答案 1 :(得分:4)
很容易让任意数据显示在更改列表中或使字段显示在表单中:list_display
任意获取实际模型属性,或模型或modeladmin上定义的方法,以及您可以子类forms.ModelForm
将您想要的任何字段类型添加到更改表单中。
将两者结合起来更加困难/不可能是什么,即在变更清单上有任意数据,您可以通过指定list_editable
就地编辑。 Django似乎只接受对应于数据库字段的真实模型属性。 (甚至在模型定义中对方法使用@property
是不够的。)
有没有人找到一种方法来编辑直接从更改列表页面中实际出现在模型上的字段?
答案 2 :(得分:1)
在编辑表单中,将属性名称放入readonly_fields(仅限1.2向上)。
在更改列表中,将其放入list_display。
答案 3 :(得分:1)
您可以在模型中使用@property装饰器(Python> = 2.4):
class Product(models.Model):
@property
def ranking(self):
return 1
“排名”可以在list_display
中使用:
class ProductAdmin(admin.ModelAdmin):
list_display = ('ranking', 'asin', 'title')