私はユーザーにプロフィール写真を変更させたいと思っています。写真をアップロードするとき、成功ページにリダイレクトされますが、写真はフォルダにアップロードされず、関連するフィールドは空白です。ユーザーが既に写真を持っている場合は、フィールドを空白にリセットするので、フォームを送信した後にユーザーは写真がなくなります。プロフィール画像を更新する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 %}
私はすでにいくつかのトピックを読んでいますが、成功していません。
マチュー
ありがとう、私のテンプレートの間違いでした:)私は属性enctype = "multipart/form-data"を忘れていました。 – MattL