3

私のアプリでは、ユーザーがプロフィール写真を持つことを許可しています。そして、私は彼らがそれを変えることができるようにしたいと思います. 驚いたことに、それを達成する方法については何も見つかりませんでした。

これが私が試したものです:

models.py

        class UserProfile(FacebookProfileModel):
           user = models.OneToOneField(User)
           profilepic = models.ImageField(upload_to="profilepics/", default="blabla.jpg")

私のhtml:

       <form method='post' action='{%url myproject.views.changes %}>
       <div class="controls">
       <input type="file" name="image">
       </div>
       <input type="submit">
       </form>

私の見解:

      def changes(request):
          if 'image' in request.POST:
             image = request.POST.get('image')
             userprofile.profilepic.url = image
             userprofile.save()

これを行うと、次のエラー メッセージが表示されます。

       'AttributeError at /my/site/
        can't set attribute'

どうすればそれを達成できるかについてのアイデアはありますか? ありがとうございました

4

2 に答える 2

2

最初に UserProfile オブジェクトをリクエストしてから、

使用する必要があるようです

image = request.FILES['image']
userprofile.profilepic = image

それ以外の

image = request.POST.get('image')
userprofile.profilepic.url = image

Jakeが言ったように、この例、views.pyセクションを参照してください

于 2013-02-27T15:34:16.120 に答える
1

フォームに含める必要がありenctype="multipart/form-data"ます。を更新する方法の例を次に示します。ImageField:

最初に update_form.html:

<form method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit" class="save btn btn-default">Update</button>
</form>

次に、フォーム:

from django.contrib.auth import get_user_model


class EditProfile(UserChangeForm):
    class Meta:
        model = get_user_model()
        fields = ('email', 'name', 'avatar')

そして最後にビュー:

def user_edit(request):
    if request.method == 'POST':
        form = EditProfile(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            if request.FILES.get('avatar', None) != None:
                try:
                    os.remove(request.user.avatar.url)
                except Exception as e:
                    print('Exception in removing old profile image: ', e)
                request.user.avatar = request.FILES['avatar']
                request.user.save()
            return redirect('user:profile', id=request.user.id)
    else:
        form = EditProfile(instance=request.user)
        return render(request, 'user/user-edit.html', {'form': form})
于 2020-04-30T13:29:09.780 に答える