2011-06-08 93 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

相關問題