Django ModelForm更新个人资料照片不保存照片

问题描述:

我想让我的用户更改他们的个人资料照片。上传照片时,我被重定向到成功页面,但照片未上传到文件夹,关联的字段为空。请注意,如果用户已经有了照片,它会将该字段重置为空白,以便在提交表单后用户不再有照片。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 %} 

我已经阅读了几个主题,但没有成功。

预先感谢您的帮助,

马修

请确保您有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