Mostrar imagens no Django Admin !

776 views
Skip to first unread message

Python - Django

unread,
Apr 12, 2011, 12:58:19 AM4/12/11
to Django Brasil
Oi Pessoal,

Estou construindo um CMS e tenho um módulo chamado diretoria, lá eu
coloco os dados do diretor e um campo ImageField, segue o model:


--> models.py

class Diretoria(models.Model):
codigo_diretor = models.AutoField('Código Diretoria',
primary_key=True)
codigo_topico = models.ForeignKey(Topico, related_name='+',
verbose_name='Tópico')
nome_diretor = models.CharField('Nome',max_length=200)
email_diretor = models.EmailField('e-mail', blank=True, null=True)
celular_diretor = models.CharField('Celular', max_length=20,
null=True, blank=True)
foto_diretor = models.ImageField('Foto
Diretor(a)',upload_to='media', blank=True, null=True, )

class Meta:
verbose_name_plural = 'Diretoria'
verbose_name = 'Diretoria'


Até aqui tudo bem, ele gera certinho a tabela no banco e tals, agora
vamos ao admin.py

class DiretoriaAdmin(admin.ModelAdmin):
fields = ('codigo_topico', 'nome_diretor', 'email_diretor',
'celular_diretor', 'foto_diretor', 'codigo_cargo', 'topicos',)
list_display = ('nome_diretor', 'codigo_cargo',
'codigo_topico','foto_diretorFunc')
list_display_links = ('codigo_topico', 'nome_diretor',
'codigo_cargo', 'foto_diretorFunc')
search_fields = ['nome_diretor',
'codigo_topico__descricao_topico']
list_filter = ['codigo_cargo','codigo_topico__descricao_topico']

def foto_diretorFunc(self, obj):
return u'<img src=media/%s/>' % (obj.foto_diretor)

foto_diretorFunc.short_description = 'Fotografia'
foto_diretorFunc.allow_tags = True

criei a função foto_diretorFunc para pegar a imagem e retorna como
html para o template do admin do django mostrar, mas as imagens vem
como link quebrado, já pesquisei tudo que é jeito como ele poderia
mostrar a imagem na lista de registros do django admin, segue a
configuração do meu settings


# Django settings for portal project.
import os

PROJECT_ROOT_PATH = os.path.dirname(os.path.abspath(__file__))

print PROJECT_ROOT_PATH

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
# ('Your Name', 'your_...@domain.com'),
)

MANAGERS = ADMINS

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add
'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'portal', # Or path to database
file if using sqlite3.
'USER': 'postgres', # Not used with
sqlite3.
'PASSWORD': '123456', # Not used with
sqlite3.
'HOST': 'localhost', # Set to empty
string for localhost. Not used with sqlite3.
'PORT': '5432', # Set to empty string for
default. Not used with sqlite3.
}
}

# Local time zone for this installation. Choices can be found here:
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
# although not all choices may be available on all operating systems.
# On Unix systems, a value of None will cause Django to use the same
# timezone as the operating system.
# If running in a Windows environment this must be set to the same as
your
# system time zone.
TIME_ZONE = 'America/Campo_Grande'

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'pt-br'

SITE_ID = 1

# If you set this to False, Django will make some optimizations so as
not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

# Absolute filesystem path to the directory that will hold user-
uploaded files.
# Example: "/home/media/media.lawrence.com/"
MEDIA_ROOT = os.path.join(PROJECT_ROOT_PATH, 'media')

print MEDIA_ROOT

# URL that handles the media served from MEDIA_ROOT. Make sure to use
a
# trailing slash if there is a path component (optional in other
cases).
# Examples: "http://media.lawrence.com", "http://example.com/media/"
MEDIA_URL = '/media/'
print MEDIA_URL

# URL prefix for admin media -- CSS, JavaScript and images. Make sure
to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/admin_media/'

# Make this unique, and don't share it with anybody.
SECRET_KEY = '-$#h8*o7ek$ofgkv7r4(3$34ly7u3hp+jvb_49cks70*d(tpdz'

# List of callables that know how to import templates from various
sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)

ROOT_URLCONF = 'portal.urls'

TEMPLATE_DIRS = (
os.path.join(PROJECT_ROOT_PATH, 'templates')
# Put strings here, like "/home/html/django_templates" or "C:/www/
django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
)

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'siems',
#'django.contrib.admindocs',
)


e o arquivo urls.py


from django.conf.urls.defaults import *
from django.conf import settings

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
(r'^$', 'siems.views.index'),
(r'^admin/', include(admin.site.urls)),
)


Eu acho que é algum erro de url roteamento, não sei o que está
faltando e como fazer para ele achar e mostrar estas imagens, fazer o
upload no local certo isso está, mas o inverso não acontece.

Qualquer dica?

obrigado

marcos thomaz

unread,
Apr 12, 2011, 8:28:19 AM4/12/11
to django...@googlegroups.com
No método que está assim:
    def foto_diretorFunc(self, obj):
        return u'<img src=media/%s/>' % (obj.foto_diretor)


Deixe assim:
    def foto_diretorFunc(self, obj):
        return u'<img src="%s">' % (obj.foto_diretor.url)

 
[]'s

Marcos Thomaz

De: Python - Django <toninh...@gmail.com>
Para: Django Brasil <django...@googlegroups.com>
Enviadas: Terça-feira, 12 de Abril de 2011 1:58
Assunto: Mostrar imagens no Django Admin !
--
Django Brasil em Google Groups <http://groups.google.com.br/group/django-brasil>
Associe-se à Python Brasil e suporte nossa comunidade! <http://associacao.python.org.br/>



 

Robson

unread,
Apr 12, 2011, 8:38:15 AM4/12/11
to django...@googlegroups.com, marcos thomaz
Só complementando a dica do Marcos, adicione o allow_tags=True, senão
o admin irá escapar seu html e exibi-lo na tela..

def foto_diretorFunc(self, obj):
return u'<img src="%s">' % (obj.foto_diretor.url)

foto_diretorFunc.allow_tags = True

abs!
Robson

2011/4/12 marcos thomaz <marcos...@yahoo.com.br>:

Python - Django

unread,
Apr 12, 2011, 9:45:28 AM4/12/11
to Django Brasil
Olá,

Valeu pelas dicas, mas tinha muito mais que isso. O allow_tags = True
já estava definido, eu achei uma solução e o problema era fazer um
regex correto onde estão localizados os arquivos estáticos, então
achei uma dica no django-user internacional que aparentemente resolveu
o meu problema, estou trabalhando com debug pelo runserver local,
segue a dica que fez funcionar.

no arquivo urls.py eu inclui um if settings.DEBUG: que joguei a URL
com o regex e lá e passou a permitir visualizar os arquivos estáticos
pelo servidor de debug, a dica obj.foto_diretor.url ajudou a buscar
corretamente o caminho também, valeu Marcos e Robson, depois irei
testar em produção essa questão do local dos arquivos estáticos, agora
as fotos estão aparecendo no Admin em lista para saber o registro de
quem estou editando, ficou bem bacana.

from django.conf.urls.defaults import *
from django.conf import settings

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
(r'^$', 'siems.views.index'),
(r'^admin/', include(admin.site.urls)),
)

if settings.DEBUG:
urlpatterns += patterns('',
(r'^media/(?P<path>.*)$', 'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT}),
)

Toninho Nunes

On Apr 12, 8:38 am, Robson <r...@linux.com> wrote:
> Só complementando a dica do Marcos, adicione o allow_tags=True, senão
> o admin irá escapar seu html e exibi-lo na tela..
>
>  def foto_diretorFunc(self, obj):
>         return u'<img src="%s">' % (obj.foto_diretor.url)
> foto_diretorFunc.allow_tags = True
>
> abs!
> Robson
>
> 2011/4/12 marcos thomaz <marcosthom...@yahoo.com.br>:
>
>
>
>
>
>
>
> > No método que está assim:
> >     def foto_diretorFunc(self, obj):
> >         return u'<img src=media/%s/>' % (obj.foto_diretor)
>
> > Deixe assim:
> >     def foto_diretorFunc(self, obj):
> >         return u'<img src="%s">' % (obj.foto_diretor.url)
>
> > []'s
>
> > Marcos Thomaz
>
> > ________________________________
> > De: Python - Django <toninhonu...@gmail.com>
> >     # ('Your Name', 'your_em...@domain.com'),
> > )
>
> > MANAGERS = ADMINS
>
> > DATABASES = {
> >     'default': {
> >         'ENGINE': 'django.db.backends.postgresql_psycopg2', # Add
> > 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
> >         'NAME': 'portal',                      # Or path to database
> > file if using sqlite3.
> >         'USER': 'postgres',                      # Not used with
> > sqlite3.
> >         'PASSWORD': '123456',                  # Not used with
> > sqlite3.
> >         'HOST': 'localhost',                      # Set to empty
> > string for localhost. Not used with sqlite3.
> >         'PORT': '5432',                      # Set to empty string for
> > default. Not used with sqlite3.
> >     }
> > }
>
> > # Local time zone for this installation. Choices can be found here:
> > #http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
> > # although not all choices may be available on all operating systems.
> > # On Unix systems, a value of None will cause Django to use the same
> > # timezone as the operating system.
> > # If running in a Windows environment this must be set to the same as
> > your
> > # system time zone.
> > TIME_ZONE = 'America/Campo_Grande'
>
> > # Language code for this installation. All choices can be found here:
> > #http://www.i18nguy.com/unicode/language-identifiers.html
Reply all
Reply to author
Forward
0 new messages