如果用户在名为" 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,
})
答案 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
模型。