2013-03-08 107 views
1

我在Django管理模型中有一個IntegerField,有時候人們輸入「2100」而不是「2100」,Django抱怨「輸入一個整數」。是否有可能重寫一些方法,使我可以去掉逗號,美元符號等,以便數字可以正確解析爲整數,同時對用戶直觀?我試過clean()和clean_fields(),但它們似乎並不是我想要的,除非我不正確地使用它們。謝謝!如何自定義Django的IntegerFields管理員驗證?

回答

2

如何編寫自己的自定義整數字段,並使用它,如果Django的內置版本。有關更多信息,請參閱docs。您可能想要覆蓋IntegerField中的內置程序,然後可能是write your own FormField

我懷疑這是ModelForm上的驗證失敗,因爲您在模型上覆蓋了clean()clean_fields() - 表單驗證將在模型驗證之前踢出。

嘗試這樣:

from django.db import models 
from django.forms import fields 

class IntegerPriceFormField(fields.IntegerField): 
    def to_python(self, value): 
     if isinstance(value, basestring): 
      value = value.replace(",", "").replace("$", "") 
     return super(IntegerPriceFormField, self).to_python(value) 

class IntegerPriceField(models.IntegerField): 
    def formfield(self, **kwargs): 
     defaults = {'form_class': IntegerPriceFormField} 
     defaults.update(kwargs) 
     return super(IntegerPriceField, self).formfield(**defaults) 

然後你就可以在你的模型定義中使用IntegerPriceField代替IntegerField。

+0

謝謝,我目前正在走這條路線,但掙扎着我需要重寫的無數方法中的哪一個,比如get_prep_value,它似乎不是它。我是否需要重寫'formfield'並提供一個自定義表單呢? – mrooney 2013-03-08 22:33:14

+0

我想你可能會這樣做 - 你可以通過使用現有的FormField來破解它,但我認爲你最好自己寫。 – 2013-03-08 22:37:59

+0

要添加到此答案 - 如果您想顯示帶額外標記的字段,例如前面有一個美元符號(你可以調整它來添加逗號等),你可以覆蓋它的'prepare_value'方法,例如在'class IntegerPriceFormField'中添加:'def prepare_value(self,value):return super(IntegerPriceFormField,self).prepare_value(「$ {0}」.format(value))' – 2013-10-23 00:00:14