IntegrityError + django
我创建了一个Django应用程序。这个应用里有一个注册表单。我插入了一个jQuery插件来选择生日。但是现在,当我填写注册表单并保存时,出现了这个错误:“IntegrityError at /registrationForm/
(1048, "Column 'birthday' cannot be null")”。我会把我的代码粘贴在这里。
registrationForm.html
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<script type="text/javascript" src="http://10.1.0.90:8080/static/jquery.js"></script>
<script type="text/javascript" src="http://10.1.0.90:8080/static/jquery-ui.min.js"></script>
<link href="http://10.1.0.90:8080/static/jquery-ui.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="http://10.1.0.90:8080/static/bday-picker.js"></script>
<script type="text/javascript">
$(document).ready (function() {
//$( "#datepicker" ).datepicker();
$("#picker1").birthdaypicker({});
});
//Created / Generates the captcha function
function DrawCaptcha()
{
var a = Math.ceil(Math.random() * 10)+ '';
var b = Math.ceil(Math.random() * 10)+ '';
var c = Math.ceil(Math.random() * 10)+ '';
var d = Math.ceil(Math.random() * 10)+ '';
var e = Math.ceil(Math.random() * 10)+ '';
var f = Math.ceil(Math.random() * 10)+ '';
var g = Math.ceil(Math.random() * 10)+ '';
var code = a + ' ' + b + ' ' + ' ' + c + ' ' + d + ' ' + e + ' '+ f + ' ' + g;
document.getElementById("txtCaptcha").value = code
}
// Validate the Entered input aganist the generated security code function
function ValidCaptcha(){
var str1 = removeSpaces(document.getElementById('txtCaptcha').value);
var str2 = removeSpaces(document.getElementById('txtInput').value);
if (str1 == str2) return true;
return false;
}
// Remove the spaces from the entered and generated code
function removeSpaces(string)
{
return string.split(' ').join('');
}
</script>
</head>
<title>Login/Registration Page</title>
<body bgcolor="#736F6E" onLoad="DrawCaptcha();">
<div align="center">
<form name="userInputForm" method="POST" id="myFormid" action="http://10.1.0.90:8080/login/">
<div style="float:left;width:100%;">
<p style="float:left;margin-right:10px;width:auto;">
<label style="float:left;">Email id</label>
<br/>
<input type="text" name="username" size="25" />
</p>
<p style="float:left;margin-right:10px;width:auto;">
<label style="float:left;">Password</label>
<br/>
<input type="password" name="password" size="25" />
{% if invalid %}
Mismatch in your email/password.
{% endif %} </p>
</div>
<p style="clear:both;float:left;">
<input type="submit" value="Log in" style="float:left;margin-right:4px;"/>
{% load facebookconnect %}
{% facebook_connect_login_button %}
{% facebook_connect_script %}
<a HREF="http://10.1.0.90:8080/forgotPassword/">Forgotten your password?</a></p>
</div>
</form>
<br>
<br>
<br>
<script type="text/javascript">
function userCheck(){
/*document.getElementById('myFormid').action = "http://10.1.0.90:8080/login/";
if ((document.userInputForm.username.value.length==0)) */
}
</script>
<form name ="myform" method="POST" id='FormID'>
<table>
<tr>
<td>First name</td>
<td><input type="text" name="firstName" value="" maxlength="100" />
<b id="firstNameID" style="font-family:Times New Roman;color:#B4045F;font-size:14px;"> </td>
</tr>
<tr>
<td>Last name</td>
<td><input type="text" name="lastName" value="" maxlength="100" />
</td>
</tr>
<tr>
<td>E-mail</td>
<td><input type="text" name="email" value="" maxlength="100" />
</td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" name="password" value="" maxlength="100" />
<b id="passwordID" style="font-family:Times New Roman;color:#B4045F;font-size:14px;"> </td>
</tr>
<tr>
<td>Re-Type Password</td>
<td><input type="password" name="password1" value="" maxlength="100" />
<b id="passwordID1" style="font-family:Times New Roman;color:#B4045F;font-size:14px;"> </td>
</tr>
<tr>
<td>Gender:</td>
<td><input type="radio" name="sex" value="male" />
Male
<input type="radio" name="sex" value="female" />
Female </td>
</tr>
<tr>
<td>Birthday</td>
<td><!--<input type="text" name="datepicker" id="datepicker" value="" maxlength="100" />-->
<div class="picker" id="picker1" name="birthday" value=""></div>
</td>
</tr>
<tr>
<td width="150">Captcha</td>
<td><input type="text" id="txtCaptcha"
style="background-image:url(1.jpg); text-align:center; border:1px;
font-weight:bold; font-family:Modern" />
<input type="button" id="btnrefresh" value="Refresh" onClick="DrawCaptcha();" />
</td>
</tr>
<tr>
<td>Enter above text</td>
<td style="float:left;"><input type="text" id="txtInput" value="" maxlength="100" />
<b id="textcaptcha" style="font-family:Times New Roman;color:#B4045F;font-size:14px;"> </td>
</tr>
</table>
</form>
<div style="width:200; float:left; margin:20px 0 0 155px;">
<input type="button" value="Sign Up" onClick="isEmpty();"/>
</div>
<script type="text/javascript">
function isEmpty(){
if ((document.myform.firstName.value.length==0))
{
document.getElementById('firstNameID').innerHTML = 'Please fill this field';
return true;
}
else if ((document.myform.password.value.length==0))
{
document.getElementById('passwordID').innerHTML = 'Please fill this field';
return true;
}
else if (document.myform.password.value != document.myform.password1.value)
{
document.getElementById('passwordID1').innerHTML = 'Password mismatch';
return true;
}
else if (! ValidCaptcha())
{
document.getElementById('textcaptcha').innerHTML = 'Please fill the captcha correctly';
}
else
{
document.getElementById('FormID').action = "http://10.1.0.90:8080/registrationForm/";
document.getElementById('FormID').submit();
return false;
}
}
</script><br><br>
</body>
</html>
views
def registrationForm(request):
if request.method == "POST":
firstName = request.POST.get("firstName")
lastName = request.POST.get("lastName")
email = request.POST.get("email")
password = request.POST.get("password")
sex = request.POST.get("sex")
birthday = request.POST.get("birthday")
UniversityDetails(firstName=firstName,lastName=lastName,email=email,password=password,sex=sex,birthday=birthday).save()
send_mail('Email Verification', 'You have registered successfully', 'rv@gmail.com',
[email], fail_silently=False)
return render_to_response('login.html')
return render_to_response("registrationForm.html")
2 个回答
1
问题出在这里这一行:
<div class="picker" id="picker1" name="birthday" value=""></div>
这个值不会和你的表单一起提交。你需要添加一个隐藏的输入框来存储生日的值,这样它才能和POST数据一起发送。
<input type="hidden" name="birthday" value="" />
<div class="picker" id="picker1"></div>
然后,当你从日期选择器中选择一个日期时,要添加一个钩子来更新这个隐藏输入框的值。
编辑
我还建议你像这样重写你的Django视图,这样会更容易管理,并且可以利用Django内置的表单验证功能:
from django import forms
class DetailsForm(forms.ModelForm):
class Meta:
model = UniversityDetails
def registrationForm(request):
form = DetailsForm()
if request.method == 'POST':
form = DetailsForm(request.POST)
if form.is_valid():
send_mail('Email Verification', 'You have registered successfully', 'rv@gmail.com', [email], fail_silently=False)
form.save()
return render_to_response('login.html')
return render_to_response("registrationForm.html")
2
字段 birthday
必须有输入才能提交表单。
所以你可以选择:
<td>Birthday</td>
<td><input type="text" id="picker1" name="birthday" value=""
maxlength="100" class="picker" />
或者使用一个隐藏的输入框来处理 birthday
,然后在提交时用 JavaScript 填充它。
另外,你在保存之前没有在视图中验证模型,这样不好。
可以试试使用 django forms
,它们在模板和视图中都非常方便。
更新:
我查看了 birthdaypicker
插件,它有一个有趣的选项 hiddenDate
,可以为你在表单中创建一个名为 birthdate
的隐藏输入框。你可以这样做:
把 birthdaypicker
的使用方式改回 div
:
<td>Birthday</td>
<td><!--<input type="text" name="datepicker" id="datepicker"
value="" maxlength="100" />-->
<div class="picker" id="picker1" name="birthday" value=""></div>
在创建 birthdaypicker
时,传入 hiddendate
选项:
$(document).ready (function() {
//$( "#datepicker" ).datepicker();
$("#picker1").birthdaypicker({hiddenDate: true});
});
然后在 django
视图中,使用 birthdate
代替 birthday
birthday = request.POST.get("birthdate")