2010-04-13 6 views
0

У меня есть таблица базы данных, например. значение веса, например.Изменение отображаемых значений окна редактирования admin

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 

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

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

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

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

Это преобразует введенный номер в граммах на килограмм.

ответ

0

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

+0

Ну, пример показан только в качестве примера. Я просто хочу знать, можете ли вы изменить (масштабировать) отображаемые значения в окне «Изменить объект». – Henri

1

Метод сохранения модели, подобный этому, может привести к неожиданным результатам и, вероятно, не к чему вы хотите. Видите ли, каждый раз, когда вы сохраняете модель, ее вес будет в 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() 
Смежные вопросы