我正在努力让用户可以将头像上传到他们的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
。
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()
template(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 :(得分:1)
原来我说这一切都错了,并且正在创建新的配置文件而不是添加到现有配置文件中。通过替换views.py中的以下行来解决此问题:
newuserpic=UserProfile(userpic=request.FILES['userpic'])
newuserpic.save()
......用这个:
newuserpic=request.FILES['userpic']
current_profile.userpic=newuserpic
current_profile.save()
现在我遇到了在用户主页上正确显示图片的问题,但这是一个完全独立的问题,可能与我的MEDIA_URL有关 - 至少图片现在正在保存!
答案 1 :(得分: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属性,最后保存。