J'ai un modèle de profil utilisateur qui contient leur image «mugshot». J'utilise modelForm pour présenter un formulaire de mise à jour de profil. Il était facile de construire un formulaire de travail, mais maintenant j'ai besoin de quelques ajustements à l'image:Comment remplacer une image en utilisant ModelForm?
1) il enregistre avec le nom de fichier que l'utilisateur fournit; Je dicte plutôt le nom de fichier à utiliser. Je pensais que j'utiliserais juste le PK du modèle, et la même extension de fichier par exemple: "443.jpg"
2) il devrait remplacer l'image existante, ne pas ajouter un trait de soulignement. "443 ___. Jpg".
class Member(models.Model):
home_phone = models.CharField(max_length=10, blank=True)
image = models.ImageField(upload_to='members', default="default.png")
...
class MemberProfileForm(forms.ModelForm):
home_phone = AUPhoneNumberField(required=False)
class Meta:
model = Member
exclude = ('email','password','create_date','last_login','is_active')
J'espérais quelque chose comme ça serait tout ce qu'il faut:
form = MemberProfileForm(request.POST, request.FILES, instance=request.member)
if form.is_valid():
if request.FILES.get("image"):
form.image.name = 'poobar.jpg'
form.save()
return HttpResponseRedirect(reverse('my-profile'))
Mais 'l'image' n'existe pas dans le ModelForm (AttributeError)
Ai-je besoin de retravailler la tout à utiliser "forme" au lieu de "modelform" juste pour ces petits réglages, ou y at-il un moyen facile de contrôler la sauvegarde de l'image?
x --------------------------------------------- --------------------------------------------------
Cela semble résoudre ...
form = MemberProfileForm(request.POST, request.FILES, instance=request.member)
if form.is_valid():
if form.cleaned_data['image']:
(path, extension) = os.path.splitext(form.cleaned_data['image'].name)
form.cleaned_data['image'].name = ('%s%s' % (request.member.id, extension))
request.member.image.delete()
form.save()
... sauf que la plupart des gens veulent probablement 'request.user', où je 'request.member'.
Oh, voilà, c'est tout ce qui ne va pas (1). De ce fait, pour (2), je ne vois pas comment passer 'save = False' à la routine _image_ save qui se trouve dans modelform, mais je peux d'abord supprimer l'image existante qui obtient le même résultat. Voir la question pour une modification montrant la solution. –