如何更改Django admin中特定字段类型的呈现?
问题描述:
例如我有一个IntegerField
,我想改变它在Django管理员中的显示方式。如何更改Django admin中特定字段类型的呈现?
我认为继承它和压倒一切的__str__
和__unicode__
方法,但它并没有缝的工作。
class Duration(models.IntegerField):
def __unicode__(self):
return "x" + str(datetime.timedelta(0, self))
def __str__(self):
return "y" + str(datetime.timedelta(0, self))
更新:我只是想恰克领域是显示,而不是编辑控件(小部件)的方式。
答
我不确定你想怎么处理这个字段,但是如果你想改变显示的HTML,你需要改变表单字段使用的小部件,或者创建你自己的定制小部件:
https://docs.djangoproject.com/en/dev/ref/forms/widgets/
models.py
class LovelyModel(models.Model):
my_int = models.IntegerField()
forms.py
from widgets import WhateverWidgetIWant
class LovelyModelForm(forms.ModelForm):
my_int = models.IntegerField(widget=WhateverWidgetIWant())
class Meta:
model = LovelyModel
admin.py
from forms import LovelyModelForm
class LovelyModelAdmin(admin.ModelAdmin):
form = LovelyModelForm
你到底是想干什么?
答
我认为你需要像这样(未测试的代码)::
import datetime
from django.db import models
class Duration(models.IntegerField):
description = "Stores the number of seconds as integer, displays as time"
def to_python(self, value):
# this method can receive the value right out of the db, or an instance
if isinstance(value, models.IntegerField):
# if an instance, return the instance
return value
else:
# otherwise, return our fancy time representation
# assuming we have a number of seconds in the db
return "x" + str(datetime.timedelta(0, value))
def get_db_prep_value(self, value):
# this method catches value right before sending to db
# split the string, skipping first character
hours, minutes, seconds = map(int, value[1:].split(':'))
delta = datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds)
return delta.seconds
然而,这改变了在所有字段的值在Python的代表,不仅在管理,这可能不是所期望行为。即,你有object.duration == 'x00:1:12'
,它将被保存到数据库为72
。请参阅documentation on custom fields。
我只是想改变字段的显示方式,而不是小部件。我也更新了这个问题。 – sorin 2011-06-09 10:39:48