如何在Django admin中更改特定字段类型的呈现?

时间:2011-06-08 23:03:50

标签: django django-models django-admin

例如我有一个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))

更新:我只想改变字段显示的方式,而不是编辑控件(窗口小部件)

2 个答案:

答案 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的形式保存到数据库中。

另见documentation on custom fields