首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新配置文件图片的Django ModelForm不保存照片

更新配置文件图片的Django ModelForm不保存照片
EN

Stack Overflow用户
提问于 2017-08-19 13:26:50
回答 1查看 3.3K关注 0票数 5

我想让我的用户改变他们的配置文件图片。上传照片时,我被重定向到“成功”页面,但照片没有上传到文件夹中,相关字段为空。注意,如果用户已经有了一张照片,它会将字段重置为空白,因此在提交表单后,用户将不再有照片。

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

以下是模型、视图和形式:

Profil模型:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

意见如下:

代码语言:javascript
复制
@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})

最后,模板:

代码语言:javascript
复制
{% 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 %}

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

谢谢你的帮助,

马蒂厄

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-19 13:40:22

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

另外,在urls.py中添加这些行

代码语言:javascript
复制
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中,在<form>标记中添加enctype="multipart/form-data,如下所示:

代码语言:javascript
复制
<form method="post" enctype="multipart/form-data">

确保在django应用程序中所有这些都是正确的。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45772094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档