2012-12-02 40 views
0

我试图让用户可以将头像上传到他们的UserProfile,但我不断收到以下错误:在Django中UserProfile无法保存userpic:列“user_id”中的空值违反了非空约束条件

IntegrityError at /~csihar/userpic 
null value in column "user_id" violates not-null constraint 
DETAIL: Failing row contains (4, null, userpics/image.jpg). 

...每当我尝试上传时第一个值递增1。我试图在保存之前用用户当前配置文件实例化表单,并从模型表单中排除不相关的字段,但它仍然无法工作,我不确定我忽略了什么。但是,在发生错误之前,图像会保存到我的MEDIA_ROOT

models.py:

from django.contrib.auth.models import User 
from django.forms import ModelForm 
from django_resized import ResizedImageField 

class UserProfile(models.Model): 
    user = models.OneToOneField(User) 
    userpic = ResizedImageField(max_width=100, max_height=100, upload_to='userpics/') 

class UserpicUpload(ModelForm): 
    class Meta: 
     model = UserProfile 
     exclude = ('user','user_id') 

views.py:

from django.shortcuts import render_to_response 
from django.http import HttpResponseRedirect 
from django.template import RequestContext 
from items.models import User, UserProfile, UserpicUpload 
from django.contrib.auth.decorators import login_required 

@login_required 
def userpic(request,list_owner): 
    current_user = User.objects.get(pk=request.user.id) 
    current_profile = current_user.get_profile() 
    if request.method == 'POST': 
     form = UserpicUpload(request.POST, request.FILES, instance=current_profile) 
     if form.is_valid(): 
      newuserpic=UserProfile(userpic=request.FILES['userpic']) 
      newuserpic.save() 
     gohomeurl = "/~" + request.user.username 
     return HttpResponseRedirect(gohomeurl) 
    else: 
     form = UserpicUpload() 
     return render_to_response('userpic.html', {'listowner': list_owner, 'form':form}, RequestContext(request)) 

forms.py:

from django import forms 

class UserpicUpload(forms.ModelForm): 
    userpic = forms.ImageField() 

模板(userpic.html):

{% extends 'base.html' %} 
{% block body %} 
<form action="" method="post" enctype="multipart/form-data">{% csrf_token %} 
<p>{{ form.non_field_errors }}</p> 
<p>{{ form.userpic.errors }}</p> 
<p>{{ form.userpic }}</p> 
<p><input name="submit" value="Upload" type="submit" /> 
</form> 
{% endblock %} 
+0

试过把类UserpicUpload放在你的表单中? –

+0

@FrantzdyRomain你能澄清一下吗?我有点困惑你的意思,因为UserpicUpload已经在forms.py中定义,并成功地以{{form}}的形式传递给模板。 – csihar

回答

1

原来我一直在想这一切都是错误的,并且正在创建新的配置文件,而不是添加到现有配置文件中。这个问题是固定在views.py替换以下行:

newuserpic=UserProfile(userpic=request.FILES['userpic']) 
newuserpic.save() 

...这一点:

newuserpic=request.FILES['userpic'] 
current_profile.userpic=newuserpic 
current_profile.save() 

现在我有问题越来越PIC为用户的家庭正常显示页面,但这是一个完全独立的问题,可能与我的MEDIA_URL有关 - 至少现在照片已经正确保存!

0

在你view.py你有下面的代码:

if form.is_valid(): 
    newuserpic=UserProfile(userpic=request.FILES['userpic']) 
    newuserpic.save() 

,但你似乎没有新的配置文件与用户关联起来,我怀疑这就是为什么出现错误。像

newuserpic.user = request.user 

...可能会伎俩。我只是通过阅读你的代码发布这个答案,所以请温柔:)

编辑:如果要编辑,而不是创建一个新的当前用户的现有的配置文件你应该做的以下是您的看法:

if form.is_valid(): 
    u_profile=request.user.get_profile() 
    u_profile.userpic = request.FILES['userpic'] 
    u_profile.save() 

我们首先访问用户配置文件,然后编辑userpic属性并最终保存它。

+0

我试过,并得到错误'重复键值违反唯一约束“items_userprofile_user_id_key” 详细信息:密钥(user_id)=(1)已存在.'我想我可能会错误的事情,因为我不想创建一个新的配置文件,但添加图像到现有的。 – csihar

+0

如果我理解正确或想要更新当前用户的个人资料,那么我编辑了我的答案以回答您的新请求 – ppetrid

相关问题