2009-12-14 5 views
2

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'.

Répondre

1

Il y a un très bon jeu de documentation sur le site officiel django sur la façon de gérer le téléchargement de fichiers et de modifier leur emplacement. Cela devrait répondre à votre question sur la gestion des emplacements de téléchargement de fichiers.

En ce qui concerne l'image qui ne fait pas partie du formulaire, elle se trouve dans le dictionnaire cleaned_data. Vous le trouverez au form.cleaned_data['image'].

+0

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. –

2

En passant l'instance kwarg à la forme, il sait remplacer les anciennes données

form = MemberProfileForm(request.POST, request.FILES, instance=request.member) 
if form.is_valid(): 
    form.save() 

qui assume request.member est une instance membre par exemple

profile=Member.objects.get(user=request.user) 
form=MemberProfileForm(data=request.POST, files=request.FILES, instance=profile) 
+0

Merci, mais la question vise à surmonter quelques problèmes avec exactement ce que vous décrivez. Cela n'écrase pas l'ancienne image. Voir (1) et (2). –

Questions connexes