2017-08-19 21 views
0

私はユーザーにプロフィール写真を変更させたいと思っています。写真をアップロードするとき、成功ページにリダイレクトされますが、写真はフォルダにアップロードされず、関連するフィールドは空白です。ユーザーが既に写真を持っている場合は、フィールドを空白にリセットするので、フォームを送信した後にユーザーは写真がなくなります。プロフィール画像を更新するDjango ModelFormは写真を保存しません

私の推測では、form.save(commit = False)は写真をアップロードしたり、フィールドを更新したりするわけではありませんが、わかりません!ここで

は、モデル、ビューおよびフォームです:

プロフィールモデル:

class Profil(models.Model): 
user=models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True) 
photo_profil=models.ImageField(null=True,blank=True,upload_to='img/profils', verbose_name="Photo de profil", help_text="La taille du fichier doit être inférieure à {0}Mo. Seules les extensions .png, .jpeg et .jpg sont acceptées.".format(str(int(MAX_UPLOAD_SIZE/1000000)))) 
cours_valides=models.CharField(blank=True,max_length=255,validators=[int_list_validator]) 
niveau_valides=models.CharField(blank=True,max_length=255,validators=[int_list_validator]) 

def __str__(self): 
    return "Profil de {0}".format(self.user.username) 

のModelForm:

class PhotoForm(forms.ModelForm): 
class Meta: 
    model=models.Profil 
    fields=('photo_profil',) 
def clean_photo(self): 
    photo=self.cleaned_data.get('photo_profil') 
    if photo.size>settings.MAX_UPLOAD_SIZE: 
     raise forms.ValidationError(_("Le fichier envoyé depasse la limite de %sMo.".format(str(settings.MAX_UPLOAD_SIZE/1000000)))) 
    return photo 

とビュー:

最後に
@login_required() 
def change_photo(request): 
    if request.method=="POST": 
     form=forms.PhotoForm(request.POST,request.FILES) 
     if form.is_valid(): 
      profil=form.save(commit=False) 
      profil.user=request.user 
      profil.save() 
      return redirect('espace_personnel') 
    else: 
     form=forms.PhotoForm() 
    return render(request,'utilisateurs/registration/change_photo.html',{'form':form}) 

テンプレート:

{% block item %} 
    <h3> Modifier sa photo de profil </h3> 
    <hr> 
    <div class="row"> 
     <div class="col-lg-4"> 
      <img src="{{user.profil.photo_profil_url}}" alt="{{user.username}}" class="img-responsive"/> 
     </div> 
     <div class="col-lg-8"> 
      <h5>Photo actuelle</h5> 
      <p class="text-justify"> Votre photo n'est visible pour les autres utilisateurs qu'à côté des commentaires que vous laissez sur le site.</p> 
     </div> 
    </div> 
    <hr> 
    <form method="post"> 
    {% csrf_token %} 
    <div class="form-group"> 
     {{form.photo_profil}} 
    </div> 
    <p class="alert alert-info">{{form.photo_profil.help_text}}</p> 
    <button type="submit" class="btn btn-primary">Envoyer</button> 
    </form> 
    <hr> 
{% endblock item %} 

私はすでにいくつかのトピックを読んでいますが、成功していません。

マチュー

答えて

1

、あなたの助けのために事前にありがとうあなたがMEDIA_ROOTとあなたのsettings.pyファイルで指定されたMEDIA_URLを持っていることを確認します。また

urls.pyに次の行を追加します。

それとは別に
from django.conf import settings 
from django.conf.urls.static import static 

urlpatterns = [ 
    # ... the rest of your URLconf goes here ... 
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

html formで、このように、enctype="multipart/form-data<form>でタグを追加します。

<form method="post" enctype="multipart/form-data"> 

あなたはこれらすべてがで修正していることを確認してくださいあなたのdjangoアプリ。

+0

ありがとう、私のテンプレートの間違いでした:)私は属性enctype = "multipart/form-data"を忘れていました。 – MattL

関連する問題