2011-06-08 109 views
3

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

更新:我只是想恰克领域是显示,而不是编辑控件(小部件)的方式。

回答

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 

你到底是想干什么?

+0

我只是想改变字段的显示方式,而不是小部件。我也更新了这个问题。 – sorin 2011-06-09 10:39:48

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的代表,不仅在管理,这可能不是所期望行为。即,你有object.duration == 'x00:1:12',它将被保存到数据库为72。请参阅documentation on custom fields

相关问题