1
我在Django管理模型中有一個IntegerField,有時候人們輸入「2100」而不是「2100」,Django抱怨「輸入一個整數」。是否有可能重寫一些方法,使我可以去掉逗號,美元符號等,以便數字可以正確解析爲整數,同時對用戶直觀?我試過clean()和clean_fields(),但它們似乎並不是我想要的,除非我不正確地使用它們。謝謝!如何自定義Django的IntegerFields管理員驗證?
我在Django管理模型中有一個IntegerField,有時候人們輸入「2100」而不是「2100」,Django抱怨「輸入一個整數」。是否有可能重寫一些方法,使我可以去掉逗號,美元符號等,以便數字可以正確解析爲整數,同時對用戶直觀?我試過clean()和clean_fields(),但它們似乎並不是我想要的,除非我不正確地使用它們。謝謝!如何自定義Django的IntegerFields管理員驗證?
如何編寫自己的自定義整數字段,並使用它,如果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。
謝謝,我目前正在走這條路線,但掙扎着我需要重寫的無數方法中的哪一個,比如get_prep_value,它似乎不是它。我是否需要重寫'formfield'並提供一個自定義表單呢? – mrooney 2013-03-08 22:33:14
我想你可能會這樣做 - 你可以通過使用現有的FormField來破解它,但我認爲你最好自己寫。 – 2013-03-08 22:37:59
要添加到此答案 - 如果您想顯示帶額外標記的字段,例如前面有一個美元符號(你可以調整它來添加逗號等),你可以覆蓋它的'prepare_value'方法,例如在'class IntegerPriceFormField'中添加:'def prepare_value(self,value):return super(IntegerPriceFormField,self).prepare_value(「$ {0}」.format(value))' – 2013-10-23 00:00:14