【问题标题】:Django Form: comma separated decimal numbers throwing validation errorsDjango Form:逗号分隔的十进制数字引发验证错误
【发布时间】:2021-03-01 11:05:01
【问题描述】:

我有一个表单,用户可以在其中输入以逗号分隔的十进制/整数值,例如 500,000 或 500,000.00。当我使用 Django ModelForm 处理该字段时,它会引发验证错误,例如 Enter a number,我想在值进入 DB 之前删除那些“,”。join_bonusvar_pay 字段具有属性 required=False 但是仍然这些字段引发“此字段是必需的”。验证错误。

我的表格:

class EmployeeSalaryForm(forms.ModelForm):
    class Meta:
        model = Salary
        fields = [
            'basic_salary',
            'convyence_allowance',
            'medical_allowance',
            'mobile_allowance',
            'executive_allowance',
            'gross_salary',
            'epf',
            'health_benefit',
            'ctc',
            'join_bonus',
            'var_pay',
        ]

        
        basic_salary = forms.DecimalField(max_digits=11,decimal_places=2)
        convyence_allowance = forms.DecimalField(max_digits=11,decimal_places=2)
        medical_allowance = forms.DecimalField(max_digits=11,decimal_places=2)
        mobile_allowance = forms.DecimalField(max_digits=11,decimal_places=2)
        executive_allowance = forms.DecimalField(max_digits=11,decimal_places=2)
        gross_salary = forms.DecimalField(max_digits=11,decimal_places=2)
        epf = forms.DecimalField(max_digits=11,decimal_places=2)
        health_benefit = forms.DecimalField(max_digits=11,decimal_places=2)
        ctc = forms.DecimalField(max_digits=11,decimal_places=2)
        join_bonus = forms.DecimalField(max_digits=11,decimal_places=2, required=False)
        var_pay = forms.DecimalField(max_digits=11,decimal_places=2, required=False)
        

        def clean_basic_salary(self):
            basic_salary = self.cleaned_data['basic_salary']

            return basic_salary.replace(',', '')

        def clean_convyence_allowance(self):
            convyence_allowance = self.cleaned_data['convyence_allowance']

            return convyence_allowance.replace(',', '')

        def clean_medical_allowance(self):
            medical_allowance = self.cleaned_data['medical_allowance']

            return medical_allowance.replace(',', '')

        def clean_mobile_allowance(self):
            mobile_allowance = self.cleaned_data['mobile_allowance']

            return mobile_allowance.replace(',', '')

        def clean_executive_allowance(self):
            executive_allowance = self.cleaned_data['executive_allowance']

            return executive_allowance.replace(',', '')

        def clean_gross_salary(self):
            gross_salary = self.cleaned_data['gross_salary']

            return gross_salary.replace(',', '')

        def clean_epf(self):
            epf = self.cleaned_data['epf']

            return epf.replace(',', '')

        def clean_health_benefit(self):
            health_benefit = self.cleaned_data['health_benefit']

            return health_benefit.replace(',', '')

        def clean_ctc(self):
            ctc = self.cleaned_data['ctc']

            return ctc.replace(',', '')

        def clean_join_bonus(self):
            join_bonus = self.cleaned_data['join_bonus']

            return 0 if join_bonus == None else join_bonus.replace(',', '')

        def clean_var_pay(self):
            var_pay = self.cleaned_data['var_pay']

            return 0 if var_pay == None else var_pay.replace(',', '')

薪酬模式:

class Salary(models.Model):
    class Meta:
        db_table = 'emp_salary_master'

    employee = models.ForeignKey(Employee, on_delete=models.CASCADE)

    basic_salary = models.DecimalField(max_digits=11, decimal_places=2)

    hra = models.DecimalField(max_digits=11, decimal_places=2)

    convyence_allowance = models.DecimalField(max_digits=11, decimal_places=2)

    medical_allowance = models.DecimalField(max_digits=11, decimal_places=2)

    mobile_allowance = models.DecimalField(max_digits=11, decimal_places=2)

    executive_allowance = models.DecimalField(max_digits=11, decimal_places=2)

    gross_salary = models.DecimalField(max_digits=11, decimal_places=2)

    epf = models.DecimalField(max_digits=11, decimal_places=2)

    health_benefit = models.DecimalField(max_digits=11, decimal_places=2)
    
    ctc = models.DecimalField(max_digits=11, decimal_places=2)
    
    join_bonus = models.DecimalField(max_digits=11, decimal_places=2, default=0)
    
    var_pay = models.DecimalField(max_digits=11, decimal_places=2, default=0)
    
    to_date = models.DateField()

    from_date = models.DateField()

    created_at = models.DateField(auto_now_add=True)
    updated_at = models.DateField(auto_now_add=True)

【问题讨论】:

    标签: python python-3.x django django-forms


    【解决方案1】:

    尝试进行类型转换:

    def clean_basic_salary(self):
        basic_salary = self.cleaned_data['basic_salary']
    
        return int(basic_salary.replace(',', ''))
    
    def clean_convyence_allowance(self):
        convyence_allowance = self.cleaned_data['convyence_allowance']
    
        return int(convyence_allowance.replace(',', ''))
    
    def clean_medical_allowance(self):
        medical_allowance = self.cleaned_data['medical_allowance']
    
        return int(medical_allowance.replace(',', ''))
    
    def clean_mobile_allowance(self):
        mobile_allowance = self.cleaned_data['mobile_allowance']
    
        return int(mobile_allowance.replace(',', ''))
    
    def clean_executive_allowance(self):
        executive_allowance = self.cleaned_data['executive_allowance']
    
        return int(executive_allowance.replace(',', ''))
    
    def clean_gross_salary(self):
        gross_salary = self.cleaned_data['gross_salary']
    
        return int(gross_salary.replace(',', ''))
    
    def clean_epf(self):
        epf = self.cleaned_data['epf']
    
        return int(epf.replace(',', ''))
    
    def clean_health_benefit(self):
        health_benefit = self.cleaned_data['health_benefit']
    
        return int(health_benefit.replace(',', ''))
    
    def clean_ctc(self):
        ctc = self.cleaned_data['ctc']
    
        return int(ctc.replace(',', ''))
    
    def clean_join_bonus(self):
        join_bonus = self.cleaned_data['join_bonus']
    
        return 0 if join_bonus == None else int(join_bonus.replace(',', ''))
    
    def clean_var_pay(self):
        var_pay = self.cleaned_data['var_pay']
    
        return 0 if var_pay == None else int(var_pay.replace(',', ''))
    
    

    由于您已将这些字段创建为十进制字段,因此您只能输入 int 或 float 值。当您从正常形式获取数据时,它以字符串的形式出现。所以要么你必须使用类型转换或使用 Django 模型表单来解决这个问题。希望这能解决问题。谢谢!

    【讨论】:

    • 感谢您的回复,但它不起作用,因为这些方法是在设置值之后运行的。由于这些字段需要十进制值,因此会不断引发验证错误。
    猜你喜欢
    • 1970-01-01
    • 2014-03-19
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 2016-03-23
    • 1970-01-01
    相关资源
    最近更新 更多