使用Django和Javascript验证表单字段时获取ValueError

时间:2017-06-13 13:33:36

标签: javascript python django

我在使用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时,这些错误即将发生。请帮我解决这个错误。

2 个答案:

答案 0 :(得分:1)

您的JS实际上没有进行任何验证,因为如果值为空,则不会阻止提交。在这些情况下你需要<system.web> <httpRuntime requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,\,?"/> </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>