Vous n'êtes pas identifié(e).
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
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
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
> 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
Le 30/03/2011 10:34, Bruno Bord a écrit :
> from django.conf import settings
Ca marche !
Merci beaucoup.
Hors ligne
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
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
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
ca marche aussi avec cette methode.
Hors ligne