在django中上传文件,给出了IntegrityError

时间:2017-04-26 13:45:42

标签: django django-models django-forms django-templates django-views

我在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%}

这是我的尝试请帮助我,我提前感谢所有这些东西的新手。

2 个答案:

答案 0 :(得分:1)

首先,我认为您不应该向User字段提供默认值,因为它是OneToOneField,并且指定默认值会使整个目的失败。

其次,我认为问题在于你的帖子保存信号,因为你指定了两个信号,一个可能与另一个信号冲突。我,某种程度上无法理解第二个信号处理程序(save_user_profile)的用途。你可以删除它并尝试吗?

答案 1 :(得分:1)

您很可能已在数据库中拥有该用户ID的个人资料。因为这种关系是一对一的。一个配置文件只能有一个且只有一个用户。保存表单时,如果配置文件已存在,则应更新而不是创建。