例如我有一个IntegerField
,我想改变它在整个Django管理员中的显示方式。
我考虑过对它进行子类化并覆盖__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))
更新:我只想改变字段显示的方式,而不是编辑控件(窗口小部件)。
答案 0 :(得分:2)
我不确定您要对该字段执行什么操作,但是如果要更改显示的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
你想做什么?
答案 1 :(得分:1)
我认为你需要这样的东西(未经测试的代码)::
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中表示字段值的方式,而不仅仅是在admin中,这可能不是一个理想的行为。即,您有object.duration == 'x00:1:12'
,它将以72
的形式保存到数据库中。