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

时间:2017-08-19 13:26:51

标签: python django upload modelform profile-picture

我想让我的用户更改他们的个人资料图片。上传照片时,我被重定向到成功页面,但照片未上传到文件夹,相关字段为空白。请注意,如果用户已有照片,则会将该字段重置为空白,因此在提交表单后,该用户不再拥有照片。

我的猜测是form.save(commit = False)不上传照片,也不更新字段,但我不明白为什么!

以下是模型,视图和表格:

Profil模型:

class My_Class extends Another_Class {
  private $my_data = array();

  public function append_to_my_data() {
    $my_data[] = $this->get_result();
  }
}

ModelForm:

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)

观点:

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})

我已经阅读了一些主题,但没有成功。

提前感谢您的帮助,

马修

1 个答案:

答案 0 :(得分:3)

确保MEDIA_ROOT文件中指定了MEDIA_URLsettings.py

另外,在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应用程序中包含所有这些内容。