列中的空值在保存 ModelForm 时违反了非空约束
null value in column violates not-null constraint while saving ModelForm
我有一个模型,它扩展了 django 的 User
模型,如下所示:
class UserProfile(models.Model):
user = models.OneToOneField(User, verbose_name="user details")
rewardpoints = models.IntegerField("rewardpoints")
def __str__(self):
return "%s's profile" % self.user.username
我的forms.py
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = ['rewardpoints']
class UserForm(ModelForm):
class Meta:
model = User
fields = ['username', 'password']
我的view.py
class UserProfileFormView(View):
def post(self, request, *args, **kwargs):
userform = UserForm(request.POST, prefix='users')
userprofileform = UserProfileForm(request.POST, prefix='userprofiles')
if userform.is_valid() and userprofileform.is_valid():
new_user = userform.save() #### Error over here.
new_userprofile = userprofileform.save(commit=False)
new_userprofile.user = new_user
new_userprofile.save()
return HttpResponseRedirect(reverse('users:welcome'))
else:
userform = UserForm(prefix='users')
userprofileform = UserProfileForm(prefix='userprofiles')
return render(request, 'users/signup.html', {'user_form': userform, 'userprofile_form': userprofileform})
def get(self, request, *args, **kwargs):
userform = UserForm(prefix='users')
userprofileform = UserProfileForm(prefix='userprofiles')
return render(request, 'users/signup.html', {'user_form': userform, 'userprofile_form': userprofileform})
我的signup.html
<p> Hello Signup!! </p>
<form action="{% url 'users:signup' %}" method="post">
{% csrf_token %}
{{ user_form.username.label_tag }}
{{ user_form.username }}
{{ user_form.password.label_tag }}
{{ user_form.password }}
{{ userprofile_form }}
<input type="submit" value="Submit" />
</form>
</html>
但是在发出post请求时,出现了这个错误:null value in column "rewardpoints" violates not-null constraint
请告诉我解决这个问题的方法。
错误是因为你的字段rewardpoints
需要一些值,它不能为空,所以,或者通过你的表单将一个值传递给rewardpoint,或者你可以为它设置一个默认值(推荐) .然后,当您创建用户配置文件时,表单会将 0 设置为初始值。
class UserProfile(models.Model):
user = models.OneToOneField(User, verbose_name="user details")
rewardpoints = models.IntegerField(default=0)
我有一个模型,它扩展了 django 的 User
模型,如下所示:
class UserProfile(models.Model):
user = models.OneToOneField(User, verbose_name="user details")
rewardpoints = models.IntegerField("rewardpoints")
def __str__(self):
return "%s's profile" % self.user.username
我的forms.py
class UserProfileForm(ModelForm):
class Meta:
model = UserProfile
fields = ['rewardpoints']
class UserForm(ModelForm):
class Meta:
model = User
fields = ['username', 'password']
我的view.py
class UserProfileFormView(View):
def post(self, request, *args, **kwargs):
userform = UserForm(request.POST, prefix='users')
userprofileform = UserProfileForm(request.POST, prefix='userprofiles')
if userform.is_valid() and userprofileform.is_valid():
new_user = userform.save() #### Error over here.
new_userprofile = userprofileform.save(commit=False)
new_userprofile.user = new_user
new_userprofile.save()
return HttpResponseRedirect(reverse('users:welcome'))
else:
userform = UserForm(prefix='users')
userprofileform = UserProfileForm(prefix='userprofiles')
return render(request, 'users/signup.html', {'user_form': userform, 'userprofile_form': userprofileform})
def get(self, request, *args, **kwargs):
userform = UserForm(prefix='users')
userprofileform = UserProfileForm(prefix='userprofiles')
return render(request, 'users/signup.html', {'user_form': userform, 'userprofile_form': userprofileform})
我的signup.html
<p> Hello Signup!! </p>
<form action="{% url 'users:signup' %}" method="post">
{% csrf_token %}
{{ user_form.username.label_tag }}
{{ user_form.username }}
{{ user_form.password.label_tag }}
{{ user_form.password }}
{{ userprofile_form }}
<input type="submit" value="Submit" />
</form>
</html>
但是在发出post请求时,出现了这个错误:null value in column "rewardpoints" violates not-null constraint
请告诉我解决这个问题的方法。
错误是因为你的字段rewardpoints
需要一些值,它不能为空,所以,或者通过你的表单将一个值传递给rewardpoint,或者你可以为它设置一个默认值(推荐) .然后,当您创建用户配置文件时,表单会将 0 设置为初始值。
class UserProfile(models.Model):
user = models.OneToOneField(User, verbose_name="user details")
rewardpoints = models.IntegerField(default=0)