2016-04-07 63 views
3

我试图在Django中创建一个百分比字段,用户只需填写40个字符的40%。在输入框右侧会有一个百分比符号,以便他们知道他们应该填写一个百分比。 0.4必须存储在数据库中。到目前为止,我已经试过如下:Django百分比字段

class PercentageField(fields.FloatField): 
    widget = fields.TextInput(attrs={"class": "percentInput"}) 

    def to_python(self, value): 
     val = super(PercentageField, self).to_python(value) 
     if is_number(val): 
      return val/100 
     return val 

    def prepare_value(self, value): 
     val = super(PercentageField, self).prepare_value(value) 
     if is_number(val): 
      return str((float(val)*100)) 
     return val 

def is_number(s): 
    if s is None: 
     return False 
    try: 
     float(s) 
     return True 
    except ValueError: 
     return False 

它的工作原理,但问题是,当我张贴无效数据和形式再次呈现,它会显示40 4000换句话说,它乘以数量再次与100没有分开它。

任何建议如何解决它?

我试过this解决方案,但它重复了100次的值。在我纠正之后,它也有同样的问题。

我正在使用Python3.5

+0

如果你把'40'当成'40%'和'0.4'作为'0.4%',那么为什么要使用单独的字段呢?为什么不使用最小值和最大值验证器的简单FloatField()? – v1k45

+0

用户可以填写120,也可以填写120%。如果他们填入1.2,我不知道它是否是1.2%的1.2% – Johan

+0

..那么,你希望用户能够填充120 120%? – v1k45

回答

1

我找到了解决方案。我必须检查传入值是否是一个字符串。如果是这样,我不会乘以100,因为它来自表单。如下:

class PercentageField(fields.FloatField): 
    widget = fields.TextInput(attrs={"class": "percentInput"}) 

    def to_python(self, value): 
     val = super(PercentageField, self).to_python(value) 
     if is_number(val): 
      return val/100 
     return val 

    def prepare_value(self, value): 
     val = super(PercentageField, self).prepare_value(value) 
     if is_number(val) and not isinstance(val, str): 
      return str((float(val)*100)) 
     return val