我在使用Javascript和Django验证字段时遇到以下错误。
错误:
ValueError at /insert/
invalid literal for int() with base 10: ''
Request Method: POST
Request URL: http://127.0.0.1:8000/insert/
Django Version: 1.11.2
Exception Type: ValueError
Exception Value:
invalid literal for int() with base 10: ''
Exception Location: /usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py in get_prep_value, line 1853
Python Executable: /usr/bin/python
Python Version: 2.7.6
我正在解释下面的代码。
insert.html:
<script type="text/javascript">
function validateForm(){
var s=document.frmfeed;
if(s.name==''){
alert('Please enter the name');
return;
}else if(s.phone==''){
alert('Please enter the phone no');
return;
}else if(s.age==''){
alert('Please enter the age');
return;
}else{
}
}
</script>
<form method="post" action=" " onSubmit="return validateForm();" name="frmfeed">
{% csrf_token %}
<label>Name: </label>
<input name="name" value="{{person.name}}">
<br>
<label>Phone: </label>
<input name="phone" value="{{person.phone}}">
<br>
<label>Age: </label>
<input name="age" value="{{person.age}}">
<br>
<input type="hidden" name="id" value="{{person.id}}">
<input type="submit" value="Submit">
</form>
view.py:
def insert(request):
# If this is a post request we insert the person
if request.method == 'POST':
p = Person(
name=request.POST['name'],
phone=request.POST['phone'],
age=request.POST['age']
)
p.save()
return redirect('/')
else:
return render(request, 'insert.html', {})
model.py:
class Person(models.Model):
name = models.CharField(max_length=200)
phone = models.CharField(max_length=15)
age = models.IntegerField()
在这里,我需要检查所有输入字段,这些字段在提交之前不应为空,但是当我点击submit button
时,这些错误即将发生。请帮我解决这个错误。
答案 0 :(得分:1)
您的JS实际上没有进行任何验证,因为如果值为空,则不会阻止提交。在这些情况下你需要<system.web>
<httpRuntime requestPathInvalidCharacters="<,>,*,%,&,\,?"/>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
...
</modules>
</system.webServer>
。
但是,你不应该这样做。现代浏览器已经包含表单验证,如果您在字段上添加return false
属性,它将启动。
如果使用表单类,Django本身将输出该属性 - 同样重要的是,还要在服务器端验证。你绝对应该这样做。
答案 1 :(得分:0)
您的模型包含年龄的整数字段,您将字符串传递给该字段。 request.POST['age']
始终返回一个字符串。
尝试按照这样编辑的视图,
def insert(request):
if request.method == 'POST':
p = Person( name=request.POST['name'], phone=int(request.POST['phone']), age=int(request.POST['age']) )
p.save()
return redirect('/')
else:
return render(request, 'insert.html', {})
这里我需要检查那些应该
的输入字段注意:假设您的phone
字段也是整数字段。如果不忽略phone=
字段中的更改。
修改强>
您可以在表单中的type= "number"
年龄标记中指定input
。
<form method="post" action=" " onSubmit="return validateForm();" name="frmfeed">
{% csrf_token %}
<label>Name: </label>
<input name="name" value="{{person.name}}" required> <br>
<label>Phone: </label>
<input name="phone" value="{{person.phone}}" required> <br>
<label>Age: </label>
<input type="number" name="age" value="{{person.age}}" required> <br>
<input type="hidden" name="id" value="{{person.id}}">
<input type="submit" value="Submit">
</form>