0

我正在尝试这样做,以便用户可以将头像上传到他们的 UserProfile,但我不断收到以下错误:

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在错误发生之前保存到我的。

模型.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')

视图.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))

表格.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 %}
4

2 回答 2

1

原来我做错了,正在创建新的配置文件,而不是添加到现有的配置文件中。通过替换 views.py 中的以下行来解决问题:

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

...有了这个:

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

现在我在让图片在用户主页上正确显示时遇到问题,但这是一个完全独立的问题,可能与我的 MEDIA_URL 相关 - 至少现在图片已正确保存!

于 2012-12-03T02:29:12.937 回答
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 属性,最后保存。

于 2012-12-02T22:55:17.547 回答