Vamos a ver cómo guardar un archivo a partir de su URL. Este método nos permitirá descargar y guardar cualquier archivo de Internet y nos servirá tanto para campos ImageField como FileField.
Como ejemplo vamos a ver un modelo con un campo imagen como el siguiente:
from django.db import models
class Foto(models.Model):
imagen = models.ImageField(upload_to='archivos/')
Para guardar cualquier imagen de una URL descargaremos el archivo utilizando urllib y lo guardaremos de la siguiente manera:
import urllib
from django.core.files import File
from models import Foto
url = 'http://www.sitio.com/imagen.jpg'
content = urllib.urlretrieve(url)
nombre = url.split('/')[-1]
f = Foto()
f.imagen.save(nombre, File(open(content[0])), save=True)
Publicado por Antonio Melé el Sábado 14 d Agosto d 2010 | 3 comentarios | Categorías: fields, trucos
El campo de formulario ModelChoiceField sirve para permitir la selección de un elemento entre los objetos resultantes de una QuerySet. La QuerySet inicial puede definirse en el propio campo del formulario. Un ejemplo de uso en nuestro forms.py sería:
from django import forms
from django.contrib.auth.models import User
class MiFormulario(forms.Form):
usuario = forms.ModelChoiceField(queryset=User.objects.all())
En este ejemplo nuestro formulario tiene un campo usuario que permite seleccionar un usuario entre todos los registrados. Sin embargo a veces necesitamos que la QuerySet sea distinta de la predefinida en el formulario. Vamos a ver cómo definir la QuerySet dinámicamente al crear un objeto de formulario.
Para definirla dinámicamente primero cambiamos la QuerySet inicial por una QuerySet vacía. El campo ModelChoiceField espera que le pasemos una QuerySet pero aún no sabemos qué QuerySet queremos ejecutar (la generaremos dinámicamente al crear cada objeto de formulario) por lo que primero usamos el método none() que devuelve una lista vacía:
usuario = forms.ModelChoiceField(queryset=User.objects.none())
A continuación sobreescribimos el método __init__ del formulario para poder definir la QuerySet dinámicamente cuando se crea un formulario. Imaginemos que queremos crear una vista que contenga el formulario y que permita seleccionar cualquier usuario que no sea staff. Sin embargo si un superusuario accede a la vista queremos permitirle seleccionar cualquier usuario (incluyendo los que forman parte del staff). Éste es un ejemplo donde necesitamos definir la QuerySet en el momento de crear el formulario:
class MiFormulario(forms.Form):
usuario = forms.ModelChoiceField(queryset=User.objects.none())
def __init__(self, user, *args, **kwargs):
super(MiFormulario, self).__init__(*args, **kwargs)
if user.is_superuser:
self.fields['usuario'].queryset = User.objects.all()
else:
self.fields['usuario'].queryset = User.objects.filter(is_staff=False)
Como podemos ver, el método __init__ recibe un parámetro user. Si el usuario que recibe es superusuario el campo ModelChoiceField del formulario se construirá con la lista de todos los usuarios. De lo contrario se construirá con la lista de usuarios que no forman parte del staff del sitio web. Al crear el formulario en nuestra vista pasaremos request.user al formulario para que se construya con la QuerySet adecuada en función del usuario activo:
from forms import MiFormulario
def mi_vista(request):
mi_form = MiFormulario(user=request.user)
# ...
¡Listo! La QuerySet del campo usuario será una u otra en función de si el usuario que accede a la vista es superusuario o no. Hemos construído la QuerySet de un ModelChoiceField dinámicamente :)
Publicado por Antonio Melé el Viernes 7 d Agosto d 2009 | 10 comentarios | Categorías: fields, forms, trucos
Hoy me he topado con un artículo sobre un error muy común al utilizar ImageField ó FileField. Al usar cualquiera de estos dos tipos de campo podemos especificar la ruta relativa a nuestro setting MEDIA_ROOT en la que queremos que se guarde el archivo subido mediante el argumento upload_to.
Si utilizamos una barra / al comienzo de la ruta en upload_to el archivo ya no se sube a la ruta especificada de forma relativa a MEDIA_ROOT sino que se trata de guardar en dicha ruta a partir del directorio raíz.
Por ejemplo, con MEDIA_ROOT='/home/usuario/archivos/' y upload_to='imagenes' un supuesto archivo abc.jpg se guardaría en el directorio /home/usuario/archivos/imagenes/abc.jpg. Sin embargo con upload_to='/imagenes' el archivo se trataría de guardar como /imagenes/abc.jpg.
Publicado por Antonio Melé el Viernes 27 d Febrero d 2009 | 5 comentarios | Categorías: fields, forms, trucos
Suscríbete a nuestro feed RSS y al feed de la comunidad para estar al tanto de todo lo que ocurre entorno a Django.
Tú también puedes escribir en éste blog. Para hacerlo basta con que nos digas sobre qué quieres escribir un artículo relacionado con Django.
Utilizar un formulario para modificar 2 modelos
Descubriendo objetos similares por sus etiquetas