Как изменить рендеринг определенного типа поля в Django admin? - PullRequest
3 голосов
/ 09 июня 2011

Например, у меня есть 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 ]

2 голосов
/ 09 июня 2011

Я не уверен, что вы хотите сделать с полем, но если вы хотите изменить отображаемый 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 голос
/ 09 июня 2011

Я думаю, вам нужно что-то вроде этого (непроверенный код) ::

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.

См. Также документацию по настраиваемым полям .

...