2010-04-13 2 views
0

예를 들어 데이터베이스 테이블이 있습니다. 예를 들어, 이 결과관리자 편집 창 표시 값 변경

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) 
); 

모델입니다 : 내가 kg 년대에 무게를 저장

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

, 즉 1kg은 1, 0.1 kg으로 저장 또는 100g 0.1

그것을하려면로 저장됩니다 사용자에게 더 쉽기 때문에 다음과 같이 지정하여 관리 목록 디스플레이에 가중치를 표시합니다.

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

이렇게하면 제품 무게 0.5 kg이고 데이터베이스에 저장되므로 관리자 목록 디스플레이에 표시됩니다.

'제품 변경'창에 표시된 번호를 변경하는 방법이 있습니까? 이 창에는 데이터베이스에서 추출한 값, 즉 0.5가 표시됩니다. 이렇게하면 kg_t 수를 보면서 help_text를 사용하여 g로 숫자를 입력하도록 지시하면 사용자가 혼동을 일으킬 수 있습니다. 나는 다음과 같이 저장 오버라이드 (override) 제품을 저장하기 전에

는 :

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

이 킬로그램 그램에 입력 한 번호로 변환합니다.

답변

0

정수를 사용하지 않고 왜 무게 그램 만 저장해야합니까?

+0

글쎄,이 예는 단지 하나의 예일뿐입니다. 'Change object'창에서 표시된 값을 변경할 수 있는지 알고 싶을뿐입니다. – 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()