2017-08-19 311 views
0

我想讓我的用戶更改他們的個人資料照片。上傳照片時,我被重定向到成功頁面,但照片未上傳到文件夾,關聯的字段爲空。請注意,如果用戶已經有了照片,它會將該字段重置爲空白,以便在提交表單後用戶不再有照片。Django ModelForm更新個人資料照片不保存照片

我的猜測是form.save(commit = False)沒有上傳照片也沒有更新字段,因爲它應該但我不明白爲什麼!

這裏是模型,視圖和形式:

的PROFIL模型:

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_ROOTMEDIA_URLsettings.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>標籤,就像這樣::

此外,在urls.py添加這些行

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

確保你擁有所有這些修正你的Django應用程序。

+0

非常感謝,這是我的模板中的一個錯誤:)!我忘記了屬性enctype =「multipart/form-data」 – MattL

相關問題