Изменение отображаемых значений окна редактирования администратора - PullRequest
0 голосов
/ 13 апреля 2010

У меня есть таблица базы данных, например, значение веса, например

CREATE TABLE product (
    id SERIAL  NOT NULL,
    product_name item_name  NOT NULL,
    .
    .

    weight NUMERIC(7,3), -- the weight in kg
    .
    .
    CONSTRAINT PK_product PRIMARY KEY (id)
);

Это результат модели:

class Product(models.Model):
    .
    weight = models.DecimalField(max_digits=7, decimal_places=3, blank=True, null=True)
    .

Я храню вес в килограммах, то есть 1 кг - это запасы, поскольку 1, 0,1 кг или 100 г - как 0,1

Чтобы облегчить пользователю, я отображаю вес в списке администратора в граммах, указав:

def show_weight(self):
    if self.weight:
        weight_in_g = self.weight * 1000
        return '%0f' % weight_in_g

Так, если продукт весит, например, 0,5 кг и хранится в базе данных как таковой, на дисплее администратора отображается 500

Есть ли способ изменить число, показанное в окне «Изменить продукт». Это окно теперь показывает значение, извлеченное из базы данных, то есть 0,5. Это смущает пользователя, когда я говорю ему с помощью help_text, чтобы ввести число в g, при этом видя количество килограммов.

Перед сохранением продукта я перезаписываю сохранение следующим образом:

def save(self):
    if self.weight:
        self.weight = self.weight / 1000

Преобразует число, введенное в граммах, в килограммы.

Ответы [ 2 ]

1 голос
/ 14 апреля 2010

Метод сохранения модели, подобный этому, может привести к неожиданным результатам и, вероятно, в любом случае не к тому, что вы хотите. Видите ли, каждый раз, когда вы сохраняете модель, ее вес уменьшается в 1000 раз.

Было бы лучше добавить пользовательский ModelForm и переопределить ModelAdmin.save_model . И вот мы, небольшой пример для вдохновения (никак не проверенный):

class ProductForm(forms.ModelForm):
    weight_gramms = forms.IntegerField(...)

    class Meta:
        model = ProductModel
        exclude = ('weight',)

    def __init__(self, *args, **kwargs):
        super(ProductForm, self).__init__(*args, **kwargs)
        if self.instance:
            self.initial['weight_gramms'] = int(self.instance.weight * 1000)

class ProductAdmin(admin.ModelAdmin):
    form = ProductForm

    def save_model(self, request, obj, form, change):
        obj.weight = form.cleaned_data['weight_gramms'] / 1000.0
        obj.save()
0 голосов
/ 13 апреля 2010

Почему бы просто не использовать целое число и хранить только граммы веса?

...