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エラーが発生する前に画像が保存されます。

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 %}
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 に答える