Django形成空数字字段清理验证

时间:2016-01-19 20:13:19

标签: django forms validation

如果用户在名为" usd_value"的字段上输入数字值,我试图以django形式进行验证使用像这样的干净方法:

Form.py

class CostItemsForm(ModelForm):

    def __init__(self, *args, **kwargs):
        super(CostItemsForm, self).__init__(*args, **kwargs)

    class Meta:
        model = CostItems
        fields = [
                    'group',
                    'description', 
                    'usd_value', 
                    'rer',
                    'pesos_value', 
                    'supplier', 
                    'position',
                    'observations',
                    'validity_date',
                ]

    def clean_usd_value(self):

        if self.cleaned_data.get('usd_value'):
            try:
                return int(self.cleaned_data['usd_value'].strip())
            except ValueError:
                raise ValidationError("usd_value must be numeric")
        return 0

但是不工作,我的意思是,如果我将字段留空或在那里输入文本值,警报根本不会激活,如果我尝试保存表单,我会收到错误(显然)。任何帮助?

这是 views.py

class CostItemInsert(View):
    template_name='cost_control_app/home.html'

    def post(self, request, *args, **kwargs):
        if request.user.has_perm('cost_control_app.add_costitems'):
            form_insert = CostItemsForm(request.POST)
            if form_insert.is_valid():
                form_save = form_insert.save(commit = False)
                form_save.save(force_insert = True) 
                messages.success(request, "cost item created")
                #return HttpResponseRedirect(reverse('cost_control_app:cost_item'))   
            else:
                messages.error(request, "couldn't save the record")
                return render(request, self.template_name,{
                                                            "form_cost_item":form_insert,
                                                          })
        else:
            messages.error(request, "you have no perrmissions to this action")

        form_cost_item = CostItemsForm()
        return render(request, self.template_name,{
                                    "form_cost_item":form_cost_item,
                                })  

2 个答案:

答案 0 :(得分:0)

我认为你的功能名称是错误的。您的字段名称为usd_value,但您的功能为clean_usd。将其更改为clean_usd_value,它应该可以正常工作。

检查Django doc部分The clean_<fieldname>()

修改

您的clean方法的返回值也是错误的。检查django doc示例,您需要返回cleaning_data而不是0:

def clean_usd_value(self):
    cleaned_data = self.cleaned_data.get('usd_value'):
    try:
        int(cleaned_data)
    except ValueError:
        raise ValidationError("usd_value must be numeric")

    return cleaned_data

但是在第二次尝试中,你可能根本不需要clean_usd_value方法,django表单字段应该有你的默认验证。完全删除clean_usd_value方法,看看它是否有效。

答案 1 :(得分:0)

我认为你不需要为此进行自定义验证。事实上,我认为django.forms.FloatField的内置验证将比你拥有的更好。

根据您的错误,我假设表单没有使用FloatField usd_value,而且有点奇怪。确保您的CostItems模型usd_value定义为django.db.models.FloatField,如下所示。

from django.db import models

class CostItems(models.Model):
    usd_value = models.FloatField()
    # other stuff

执行此操作后,CostItemsForm应自动将django.forms.FloatField用于usd_value。如果没有,您可以随时明确定义此字段。

from django import forms

class CostItemsForm(ModelForm):

    usd_value = forms.FloatField(required=True)

    class Meta:
        model = CostItems
        fields = [
            'group',
            'description', 
            'usd_value', 
            'rer',
            'pesos_value', 
            'supplier', 
            'position',
            'observations',
            'validity_date',
        ]

如果这些建议都不有用,请发布您的CostItems模型。