2013-03-08 70 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