Django-fr

Forum

  • Accueil
  • » Django-fr
  • » Affichage d'un champ "image" dans l'interface d'administration...

#1 24-03-2011 15:48:00

Yves Bourhis
Membre
Inscription : 18-01-2011
Messages : 26

Affichage d'un champ "image" dans l'interface d'administration...

Bonjour,

dans l'interface d'administration, comment peut-on afficher directement un champ de type "ImageField" à la place du lien qui permet de le visionner sur une autre page ?

Cordialement.

Hors ligne

#2 29-03-2011 23:15:54

daker
Membre
Inscription : 29-03-2011
Messages : 13

Re : Affichage d'un champ "image" dans l'interface d'administration...

Bonsoir, voici la méthode :

class Photo(models.Model):
    
    def visuel(self):
        return '<img src="%s" width="50" height="50"/>' % self.img.url
    visuel.allow_tags = True

    titre = models.CharField(max_length = 250)
    img = models.ImageField(blank=False, upload_to='photos/') # ton image ici

    def __unicode__(self):
       return u"%s" %titre

et dans ton admin.py il faut faire

class PhotoAdmin(admin.ModelAdmin):    
    # visuel c'est la fonction qui renvoi le code html qui va être afficher 
    # faut aussi le mettre en 1er pour qu'il soit afficher comme lien
    list_display = ( 'visuel', 'titre' )

Hors ligne

#3 30-03-2011 09:21:16

Yves Bourhis
Membre
Inscription : 18-01-2011
Messages : 26

Re : Affichage d'un champ "image" dans l'interface d'administration...

Bonjour,

Le 30/03/2011 00:15, Adnane Belmadiaf a écrit :
>      def visuel(self):
>          return '<img src="%s" width="50" height="50"/>' % self.img.url
>      visuel.allow_tags = True
 
Merci, ça fonctionne presque... si ce n'est qu'il n'y a pas d'attribut "url" dans le modèle "ImageField" : du coup j'ai pu afficher l'image en passant le "MEDIA_URL" en dur :
return '<img src="http://monserveur/mesphotos/%s" width="50" height="50"/>' % self.img
mais comment puis-je récupérer le contenu de "MEDIA_URL" dans mon code ?

Cordialement.

Hors ligne

#4 30-03-2011 09:34:54

Bruno Bord
Membre
Inscription : 11-08-2010
Messages : 25

Re : Affichage d'un champ "image" dans l'interface d'administration...

> passant le "MEDIA_URL" en dur :
> return '<img src="http://monserveur/mesphotos/%s" width="50" height="50"/>'
> % self.img
> mais comment puis-je récupérer le contenu de "MEDIA_URL" dans mon code ?

http://docs.djangoproject.com/en/1.2/ref/settings/#media-url
MEDIA_URL est un paramètre qui se trouve dans settings.py

pour l'avoir dans ton code Python:

from django.conf import settings

# ...  tu disposes ainsi de :
settings.MEDIA_URL

Dans un template, il est inclus dans le contexte par défaut grâce à :

http://docs.djangoproject.com/en/1.3/ref/templates/api/#django-core-context-processors-media

--
No'

Hors ligne

#5 30-03-2011 10:23:18

Yves Bourhis
Membre
Inscription : 18-01-2011
Messages : 26

Re : Affichage d'un champ "image" dans l'interface d'administration...

Le 30/03/2011 10:34, Bruno Bord a écrit :
> from django.conf import settings

Ca marche !

Merci beaucoup.

Hors ligne

#6 30-03-2011 15:46:21

Yves Bourhis
Membre
Inscription : 18-01-2011
Messages : 26

Re : Affichage d'un champ "image" dans l'interface d'administration...

En fait la solution apportée ne réponds que partiellement à mon problème...
Effectivement si je rajoute une méthode :
def photo(self):
     return '<img src="%s" width="50" height="50"/>' % (settings.MEDIA_URL + str(self.et_photo))
je réussis à afficher une colonne de photos dans la page "change_list.html"... mais ce que je voudrais c'est pouvoir l'afficher directement dans la page "change_form.html"  !

J'ai créé mon propre "change_form.html" pour la table concernée, mais je ne sais pas comment lui faire accéder au contenu de mes champs (contrairement à une vue "standard" où j'indique simplement {{ ma_table.mon_champ }})...

J'arrive a me dépanner en y rajoutant une ligne avec l'URL "en dur" :
<p><img src="http://serveur/url_photos/{{ object_id }}.jpg" width="50" height="50"/> </p>
mais du coup je suis obligé de stocker en vrac toutes mes photos dans le même répertoire, et de les nommer systématiquement avec le contenu de la clé unique de la table. Si quelqu'un a une meilleure idée...

Cordialement.

Hors ligne

#7 30-03-2011 16:27:02

daker
Membre
Inscription : 29-03-2011
Messages : 13

Re : Affichage d'un champ "image" dans l'interface d'administration...

Faut créer un widget qui va s'occuper de faire le rendu du thumb au lieu du path

from django import forms
from django.utils.safestring import mark_safe

class AdminPhotoWidget(forms.FileInput):
    """
    un ImageField Widget qui affiche thumbnail.
    """
    def __init__(self, attrs={}):
        super(AdminPhotoWidget, self).__init__(attrs)

    def render(self, name, value, attrs=None):
        output = []
        if value and hasattr(value, "url"):
            output.append(('<a target="_blank" href="%s">'
                           '<img src="%s" style="height: 28px;" /></a> '
                           % (value.url, value.url)))
        output.append(super(AdminPhotoWidget, self).render(name, value, attrs))
        return mark_safe(u''.join(output))

faut créer un forms.py

from django import forms
from models import Photo
from forms import AdminPhotoWidget

class AdminPhotoForm(forms.ModelForm):
    img = forms.ImageField(label='Photo', widget=AdminPhotoWidget)

    class Meta:
        model = Photo

et la fin faut faire appel au formulaire AdminPhotoForm dans ton admin.py :

from forms import AdminPhotoForm
class PhotoAdmin(admin.ModelAdmin):    
    form = AdminPhotoForm
    list_display = ( 'visuel', 'titre' )

Bon codage.

Dernière modification par daker (30-03-2011 16:27:22)

Hors ligne

#8 04-04-2011 12:48:48

Yves Bourhis
Membre
Inscription : 18-01-2011
Messages : 26

Re : Affichage d'un champ "image" dans l'interface d'administration...

Bonjour,

votre code m'a bien servi :

from django import forms
from django.utils.safestring import mark_safe

class AdminPhotoWidget(forms.FileInput):
     """
     un ImageField Widget qui affiche thumbnail.
     """
     def __init__(self, attrs={}):
         super(AdminPhotoWidget, self).__init__(attrs)

     def render(self, name, value, attrs=None):
         output = []
         if value and hasattr(value, "url"):
             output.append(('<a target="_blank" href="%s">' '<img src="%s" style="height: 100px;" /></a> ' % (value.url, value.url)))
         output.append(super(AdminPhotoWidget, self).render(name, value,attrs))
         return mark_safe(u''.join(output))

Mais je n'ai pas modifié le formulaire, je me suis contenté de changer la façon dont les champs de type "ImageField" s'affichent en rajoutant (dans la classe concernée de "admin.py") :

formfield_overrides = {
         models.ImageField: {'widget': AdminPhotoWidget},
     }

Merci beaucoup,
cordialement.

Hors ligne

#9 04-04-2011 14:59:06

daker
Membre
Inscription : 29-03-2011
Messages : 13

Re : Affichage d'un champ "image" dans l'interface d'administration...

ca marche aussi avec cette methode.

Hors ligne

  • Accueil
  • » Django-fr
  • » Affichage d'un champ "image" dans l'interface d'administration...

Pied de page des forums