Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Configurar ImageField en Django 1.6

Estas en el tema de Configurar ImageField en Django 1.6 en el foro de Python en Foros del Web. Hola a todos Estoy creando un pequeño Blog con Django y necesito añadir una imagen de cabecera a cada post. He leído algo acerca de ...
  #1 (permalink)  
Antiguo 18/11/2013, 11:09
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 4 años, 5 meses
Puntos: 1
Configurar ImageField en Django 1.6

Hola a todos

Estoy creando un pequeño Blog con Django y necesito añadir una imagen de cabecera a cada post.

He leído algo acerca de 'ImageField' pero no he conseguido importarlo con éxito

Utilizo Django 1.6 y Python3.3 bajo Ubuntu 13.10

Os dejo el estado actual del código al que le quiero añadir las imágenes:

/projecto/blog/models.py

Código:
from django.db import models

# Create your models here.

class Post(models.Model):

    title = models.CharField(max_length=100)
    body_home = models.TextField()
    body_detail = models.TextField()
    date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

...

/projecto/blog/views.py

Código:
...

def post(request, pk):
    idpost = Post.objects.get(pk=int(pk))
    comment = Comment.objects.filter(idpost = idpost)
    d = dict(post=idpost, comment=comment, form=FormCom, user=request.user)
    d.update(csrf(request))
    return render_to_response("post.html", d)

...

/projecto/projecto/urls.py

Código:
...

urlpatterns = patterns('blog.views',
    (r"^post/(?P<pk>\d+)$", "post"),
    (r"^newcomment/(\d+)$", "newcomment"),
    (r'^admin/', include(admin.site.urls)),
    (r"","main"),
)

...
Muchas gracias por la ayuda
  #2 (permalink)  
Antiguo 18/11/2013, 12:45
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 12 años, 8 meses
Puntos: 1360
Respuesta: Configurar ImageField en Django 1.6

En tu modelo Post agregas el campo que requieras en tu caso un ImageField.

Código Python:
Ver original
  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Post(models.Model):
  6.  
  7.     title = models.CharField(max_length=100)
  8.     header = models.ImageField(upload_to='headers', null=True, blank=True)
  9.     body_home = models.TextField()
  10.     body_detail = models.TextField()
  11.     date = models.DateTimeField(auto_now_add=True)
  12.  
  13.     def __str__(self):
  14.         return self.title

Obviamente haciendo esto vas a necesitar hacer los cambios correspondientes en el esquema de tu db. Ya sea usando migraciones o cambiando a mano el esquema.
  #3 (permalink)  
Antiguo 18/11/2013, 14:05
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 4 años, 5 meses
Puntos: 1
Respuesta: Configurar ImageField en Django 1.6

He conseguido añadir correctamente el campo ImageField a la tabla, pero a la hora de introducir una imagen desde el administrador me tira error de permisos en '/media/headers/'

He cambiado los permisos a 777 desde chmod pero me sigue saltando el error

El error en cuestión es el siguiente:



En esta zona parece señalar que el directorio no existe y que Django no puede crearlo, por lo que sospecho que he cometido un fallo al establecer las rutas:



En settings.py tengo lo siguiente:

Código:
MEDIA_ROOT = '/media/'
MEDIA_URL = 'http://localhost/media/'
Y mi ruta del directorio es así:

kojicomics/media/headers/

¿Alguna idea?

Un saludo

Última edición por kojicomics; 18/11/2013 a las 14:12
  #4 (permalink)  
Antiguo 18/11/2013, 14:34
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 12 años, 8 meses
Puntos: 1360
Respuesta: Configurar ImageField en Django 1.6

En MEDIA_ROOT le tienes que especificar la ruta completa.

Código Python:
Ver original
  1. MEDIA_ROOT = '/home/USER/project/path/media/'

Ademas de asegurarte que tienes permisos de lectura y escritura, también asegúrate que el propietario y grupo del directorio sea tu usuario.
  #5 (permalink)  
Antiguo 18/11/2013, 15:39
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 4 años, 5 meses
Puntos: 1
Respuesta: Configurar ImageField en Django 1.6

Cita:
Iniciado por razpeitia Ver Mensaje
En MEDIA_ROOT le tienes que especificar la ruta completa.

Código Python:
Ver original
  1. MEDIA_ROOT = '/home/USER/project/path/media/'

Ademas de asegurarte que tienes permisos de lectura y escritura, también asegúrate que el propietario y grupo del directorio sea tu usuario.
Gracias, ahora la imagen se sube correctamente al directorio '/media/headers' pero tengo otro problema

Cuando inserto la URL en la plantilla mediante {{ post.header.url }} la ruta se muestra correctamente, pero no me muestra la imagen, sino que me redirige a la raíz de la aplicación.

Supongo que necesito añadir una nueva dirección al archivo urls.py pero todavía no entiendo muy bien su sintaxis y no se qué debo añadir (en el primer mensaje muestro el estado actual de mi archivo 'urls.py')

Muchas gracias
  #6 (permalink)  
Antiguo 18/11/2013, 16:05
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 12 años, 8 meses
Puntos: 1360
Respuesta: Configurar ImageField en Django 1.6

Es porque para mostrar la imagen haces lo siguiente.

En la plantilla.
Código Python:
Ver original
  1. <img src="{{ post.header.url }}">

Sobre archivos estáticos en django 1.6. https://docs.djangoproject.com/en/1..../static-files/
  #7 (permalink)  
Antiguo 18/11/2013, 16:43
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 4 años, 5 meses
Puntos: 1
Respuesta: Configurar ImageField en Django 1.6

No logro que funcione, incluso al intentar abrir la vista previa de la imagen desde el administrador me redirige a la plantilla principal del proyecto pero mostrando la ruta de la imagen:



He leído varias veces el documento de las 'static_files' pero para que funcione de esa manera necesitaría que la propiedad 'upload_to' empleara la ruta STATIC_URL en lugar de MEDIA_URL

¿Alguna idea?
  #8 (permalink)  
Antiguo 18/11/2013, 18:11
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 12 años, 8 meses
Puntos: 1360
Respuesta: Configurar ImageField en Django 1.6

Pues por la ruta parece que se ve bien la imagen.

Pero si lo quieres es mostrar la imagen en el django admin, eso es otra cosa.

Este tema seguro te ayudara. http://stackoverflow.com/questions/1...rom-imagefield

Básicamente en tu modelo haces:
Código Python:
Ver original
  1. def image_tag(self):
  2.     return u'<img src="%s" />' % <URL to the image>
  3. image_tag.short_description = 'Image'
  4. image_tag.allow_tags = True

Y en tu model admin haces.

Código Python:
Ver original
  1. readonly_fields = ('image_tag',)

Recuerda poner los valores adecuados.
  #9 (permalink)  
Antiguo 20/11/2013, 07:54
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 4 años, 5 meses
Puntos: 1
Respuesta: Configurar ImageField en Django 1.6

No es que quiera mostrar la imagen en el django admin, sino que después de subir la imagen aparece un enlace de vista previa, pero cuando lo abro sucede lo mismo que desde el post; abre la ruta de la imagen pero no se muestra, sino que muestra la aplicación blog.

Estoy casi seguro de que es un problema en urls.py pero no se solucionarlo.

Si lo prefieres puedo subir los archivos del proyecto para que lo compruebes tú mismo.
  #10 (permalink)  
Antiguo 20/11/2013, 08:09
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 12 años, 8 meses
Puntos: 1360
Respuesta: Configurar ImageField en Django 1.6

Si los subes a github o bitbucket lo checo.
  #11 (permalink)  
Antiguo 20/11/2013, 14:00
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 4 años, 5 meses
Puntos: 1
Respuesta: Configurar ImageField en Django 1.6

Aquí lo tienes en GitHub:
https://github.com/kojicomics/myweb

Si quieres entrar en el administrador utiliza admin como usuario y password

Muchas gracias
  #12 (permalink)  
Antiguo 20/11/2013, 20:03
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 12 años, 8 meses
Puntos: 1360
Respuesta: Configurar ImageField en Django 1.6

En tus settings.py nada mas cambie:

Código Python:
Ver original
  1. MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
  2. MEDIA_URL = '/media/'

Y cambie la urls.py
Código Python:
Ver original
  1. (r"^$", "main"),
porque si no lo siguiente no funciona.

Y al final del archivo.
Código Python:
Ver original
  1. if settings.DEBUG:
  2.     urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Prueba de que funciona.
  #13 (permalink)  
Antiguo 21/11/2013, 17:02
Avatar de kojicomics  
Fecha de Ingreso: junio-2013
Mensajes: 49
Antigüedad: 4 años, 5 meses
Puntos: 1
Respuesta: Configurar ImageField en Django 1.6

Muchas gracias Razpeitia, doy por solucionado el problema

Por lo que entiendo, la modificación en las urls hace que Media se comporte como una ruta estática no?

Un saludo
  #14 (permalink)  
Antiguo 21/11/2013, 18:03
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 12 años, 8 meses
Puntos: 1360
Respuesta: Configurar ImageField en Django 1.6

La modificación a las urls es hacer que django sirva el contenido estático (media) cuando tenga DEBUG = True.

Para cuestiones de desarrollo no importa, pero cuando estas en producción configuras tu servidor web para que todo lo de /media/ sea servido por el servidor web y no por django.

Etiquetas: django
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 15:19.