我在django的用户模型中创建了一些自定义字段,我试图通过提交这些字段来提供用户设置他/她的个人资料。尽管我的自定义模型工作正常。因为我可以编辑或者在我的管理站点模式中添加这些字段。
但是当我尝试以用户身份提交该表单时,会出现如下错误: -
Exception Type: IntegrityError
Exception Value: UNIQUE constraint failed: blog_profile.user_id
我的 models.py : -
class Profile(models.Model):
user = models.OneToOneField(User,unique=True,on_delete=models.CASCADE,default=1)
bio = models.TextField(max_length=500,null=True,blank=True)
location = models.CharField(max_length=30,null=True,blank=True)
birth_date = models.DateField(null=True,blank=True)
pic=models.FileField(default='/user.png',null=True,blank=True)
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
forms.py : -
class ProfileForm(forms.ModelForm):
class Meta:
model=Profile
fields = ['bio','location','birth_date','pic']
views.py: -
def set(request):
if request.user.is_authenticated():
if request.method == 'POST':
form=ProfileForm(request.POST,request.FILES)
if form.is_valid():
item=form.save(commit=False)
item.pic=request.FILES['pic']
item.save()
return redirect('/blog')
else:
return HttpResponse('Invalid')
else:
form=ProfileForm()
return render(request,'blog/set.html',{'form':form})
我的模板: -
{% extends 'blog/base.html' %}
{%block body%}
<div class="container">
<div class="row">{{hell}}
<div class="col-md-6 col-md-offset-3">
<div class="alert alert-success" role="alert"><strong>Well Done!</strong> {{user.username}} You Have Succesfully Registered!</div>
</div>
</div>
<form method="POST" enctype="multipart/form-data">{% csrf_token %}
{{form.as_p}}
<input type="submit" value="Edit">
</form>
</div>
{%endblock%}
这是我的尝试请帮助我,我提前感谢所有这些东西的新手。
答案 0 :(得分:1)
首先,我认为您不应该向User字段提供默认值,因为它是OneToOneField,并且指定默认值会使整个目的失败。
其次,我认为问题在于你的帖子保存信号,因为你指定了两个信号,一个可能与另一个信号冲突。我,某种程度上无法理解第二个信号处理程序(save_user_profile)的用途。你可以删除它并尝试吗?
答案 1 :(得分:1)
您很可能已在数据库中拥有该用户ID的个人资料。因为这种关系是一对一的。一个配置文件只能有一个且只有一个用户。保存表单时,如果配置文件已存在,则应更新而不是创建。