2012-02-20 2 views
0

내 질문은 매우 간단하지만 문제를 해결할 수 없습니다. 저장해야하기 때문에 관리자가 표시 할 때마다 필드를 처리해야합니다. DB에서 다르게관리자가 표시하기 전에 DB에서 전처리 값

예를 들어 사용자가 관리자 (예 : 50, 70 또는 100)에 백분율을 입력해야하지만이 값은 데이터베이스에 0.5, 0.7 또는 1로 저장됩니다. 사용자가 편집 또는 그냥 그 값을 볼 수 있습니다, 그들은 DB에 수레로 저장되었습니다 비록 percetages (정수)로 그들을 다시 표시하기 위해 사전 처리되지 않습니다.

def valid_percentage(value): 
    if not 0 <= value <= 1: 
     raise ValidationError(u'Must be a value between 0 and 100') 

class PercentageField(models.IntegerField):  
    def __init__(self, *args, **kwargs): 
     kwargs['validators'] = kwargs.get('validators', []) + [valid_percentage] 
     super(PercentageField, self).__init__(*args, **kwargs) 

    def to_python(self, value): 
     return None if value is None else int(100 * value) 

    def get_prep_value(self, value): 
     return None if value is None else value/100.0 

이 그것을 할 것입니다 :

내가 좋아하는 뭔가를 생각했다. 그러나 이것은 데이터를 저장하고 잘못 표시하는 것입니다.

+0

데이터베이스에 정수를 저장하지 않으므로'IntegerField'를 서브 클래스하지 않아야합니다. 대신에'DecimalField' 또는'FloatField'를 사용해보십시오. – Alasdair

답변

0

get_db_prep_value을 시도한 다음 DB를 조사하여 어느 단계가 실패하는지 확인하십시오.

2

저는 꽤 오래 걸렸습니다. 절약을 위해 작동하는 코드 하나와 표시를 위해 작동하는 코드 하나가 있습니다. 그래서 꽤 재미 있지만 실제로는 유용하지 않습니다.

원래 올바른

은 당신이 원하는 것은 달성하기 :

  1. 를 사용하여 간단한 DecimalField 또는 모델 클래스 정의에 FloatField,

  2. 만들기 모델에 대한 ModelForm

  3. 정의 clean_yourpercentagefield() 당신의 ModelForm 100

  4. 만들기로 입력 값을 분할하고 django custom fields and modelform documentation에서 언급 한 바와 같이

을 렌더링하기 전에 (100)에 의해 값을 곱 사용자 정의 위젯 클래스를를 사용 :

을 사용자 정의 양식 입력을 to_python() 호환 모델 필드 값으로 변환하기 위해 사용자 정의 필드를 나타내는 데 사용되는 양식 필드가 모든 입력 유효성 검증 및 데이터 정리를 수행하는지 확인해야합니다. 이 경우 은 사용자 정의 양식 필드을 작성하고 필드에서 formfield() 메소드를 구현하여 to_python()이 올바른 데이터 유형을 리턴하는 양식 필드 클래스를 리턴해야합니다.

사실, 당신은 또한 다음 단계를 수행 할 수 있습니다

  1. formfield()

  2. 가 PercentageField에 의해 호출되어야한다 PercentageFormField 만들기 무시 PercentageField 클래스를 만듭니다.PercentageFormField이

당신의 의도가 잘못 당신이 제안한 방법을 수행하는 경우에 실행 오류 기본적으로 사용하는 양식 필드()

  • 만들기 PercentageWidget, 즉 to_python (이다)는 기본적으로이 코드로, 또 다시 여러 번 호출됩니다

    def to_python(self, value): 
        print 'to python', value 
        value = None if value is None else int(100 * value)consider this section of the documentation 
        print 'converted to python', value 
        return value 
    

    modelform에서 모델을 저장하기를 출력 뭔가 같은 :

    to python 32.0 
    converted to python 3200 
    clean 3200 
    to python 3200 
    converted to python 320000 
    

    당신은 은 당신이 길을 잘못 할 원하는에서 주장하는 경우 SubFieldMetaclass를 사용해야 할 것입니다.

    결론 : KISSFTW!

    이 답변에서 도움을 준 SmileyChris의 크레딧은 완벽하지는 않지만 내가 찾은 것을 나눠주지 않으면 너무 나쁠 것이라고 생각했습니다.

  • 관련 문제