2017-06-29 24 views
1

画像をアップロードしようとしています。これは、ユーザーのプロフィールのアバター画像です。Django画像アップロードの問題

現在のところ、フォームでエラーは返されませんが、データベースまたはフォルダ/ media/avatar /には何も書かれていません。

どういうところが間違っていますか?

マイビュー:

def view_avatar(request): 
    if request.method == 'POST': 
     form = UploadFileForm(request.POST, request.FILES, instance=request.user.profile) 
     if form.is_valid(): 
      form.save()    
    else: 
     form = UploadFileForm(instance=request.user.profile) 
    return render(request, 'avatar.html', locals()) 

マイ形式:

class UploadFileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('avatar',) 

マイモデル:あなたが使用しているフォームがforms.Formから継承されているためです

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    birthdate = models.DateField(null=True, blank=True) 
    avatar = models.ImageField(upload_to='media/avatar/', blank=True, null=True) 
+0

コードにフォームの検証後に 'form.save()'を追加しましたか?あなたが提供するコードではありません。 –

+0

このコードには該当しません。しかし、私がそれを追加すると、私はエラーが発生します:UploadFileForm 'オブジェクトに属性' save 'がありません。今すぐコードを更新します。 – GrandGTO

+0

'ModelForm'を使うかカスタム保存メソッドを書くべきです。 'forms.Form'には保存メソッドがありません。そのため、このエラーが発生しています。 –

答えて

0

を私はENCTYPEを忘れてしまいました! 解決策は次のとおりです。

<form method="POST" action="" enctype="multipart/form-data"> 
+0

それを並べ替えて喜んで=) –

1

、あなたがする必要がありますインスタンスを直接保存する場合はforms.ModelFormを使用してください。

変更このライン、また

class UploadFileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('avatar',) 

    def save(self, *args, **kwargs): 
     profile, created = Profile.objects.get_or_create(user=self.user) 
     profile.avatar = self.cleaned_data['avatar'] 
     profile.save() 
     return profile 

、このようなあなたのビューで編集、

if form.is_valid(): 
    file = form.save(commit=False) 
    file.user = request.user 
    file.save() 
+0

良い!私はエラーがあります:(1048、 "列 'user_id'はnullにできません) – GrandGTO

+0

(1062、"重複するエントリ '4'キー 'user_id' ") – GrandGTO

+0

このユーザーは既にプロフィールを持っていますか?エラーが既にあり、あなたのモデルにOneToOneフィールドを定義している場合は、各ユーザーに1つのプロファイルしか追加できないことを示します。 – zaidfazil

0

カスタムこのように、このためのSaveメソッドを書くことができます。

ビュー:

def view_avatar(request): 
    if request.method == 'POST': 
     form = UploadFileForm(request.POST, request.FILES, user=request.user) 
     if form.is_valid(): 
      form.save() 

    else: 
     form = UploadFileForm() 
    return render(request, 'avatar.html', locals()) 

フォーム:あなたは信号を使用することができますプロファイルを作成するための

class UploadFileForm(forms.Form): 
    class Meta: 
     model = Profile 
     fields = ('avatar',) 

    def __init__(self, *args, **kwargs): 
     self.user = kwargs.pop('user', None) 
     super(UploadFileForm, self).__init__(*args, **kwargs) 
     self.fields['avatar'].required = False 

    avatar = forms.FileField() 


    def save(self, *args, **kwargs): 
     user_profile, created = Profile.objects.get_or_create(user=self.user) 
     user_profile.avatar = self.cleaned_data.get('avatar') 
     user_profile.save() 
     return user_profile 
+0

私は試みましたが、うまくいきませんでした。私の投稿を更新します – GrandGTO

1

新しいユーザーが追加されたときにこの方法では、プロファイルが自動的にそのユーザのために生成されます

あなたmodels.py

from django.conf import settings 
from django.db.models.signals import post_save 


class Profile(models.Model): 
    user = models.OneToOneField(settings.AUTH_USER_MODEL) 
    birthdate = models.DateField(null=True, blank=True) 
    avatar = models.ImageField(upload_to='media/avatar/%y/%m/%d', blank=True, null=True) 


def post_save_profile(sender, instance, created, *args, **kwargs): 
    if created: 
     try: 
      Profile.objects.create(user=instance) 
     except: 
      pass 

post_save.connect(post_save_profile, sender=settings.AUTH_USER_MODEL) 

や誕生日などの情報を更新すると、あなたはのModelFormを使用することができますアバター。

forms.py

class UploadFileForm(forms.ModelForm): 
    class Meta: 
     model = Profile 
     fields = ('birthdate', 'avatar') 

    def __init__(self, *args, **kwargs): 
     super(UploadFileForm, self).__init__(*args, **kwargs) 
     self.fields['avatar'].required = False 

あなたviews.py

あなたはこの使用できるテンプレートでのアバター用
def view_avatar(request): 
    user = request.user 
    if request.method == "POST": 
     form = UploadFileForm(request.POST, request.FILES, instance=user.profile) 
      if form.is_valid(): 
       form.save() 

<img src="{% if user.profile.avatar %}{{ user.profile.avatar.url }}{% else %}{% static 'no-avatar.jpg' %}{% endif %}"><i></i> 
+0

ありがとう、Djangoからのエラーはありませんが、データベースに何も表示されません(そして残念ながら誕生日フィールドはNULLにリセットされました)。私のフォルダのメディア/アバター/にも何もありません。 – GrandGTO

+0

私の投稿を新しいコード – GrandGTO

+0

で更新しています。このコードを私のプロジェクトとその作業に使用しています。多分あなたは何かを見逃しましたか?ファイルが正しいフォルダにアップロードされるようにmedia_rootを正しく設定する必要があります。すでにユーザーがいた場合は、それらをすべて削除するか、データベースを削除する必要があります。このコードは、新しいユーザーを追加する場合にのみ機能し、このコードを追加する前にユーザーがほとんどいない場合は機能しません。幸運;)@GrandGTO – Navid2zp

関連する問題