Entonces, tengo un sistema en el que los usuarios pueden elegir entre una galería de imágenes ya existente o cargar una nueva imagen para procesarla y guardarla.
En primer lugar, el modelo:
class Post(models.Model): image = models.ForeignKey(Image, null=True, blank=True) title = models.CharField(max_length=200) slug = models.CharField(max_length=200, unique=True, blank=True) description = models.TextField(blank = True) text = models.TextField() def __str__(self): return self.title
y nuestra forma
class PostForm(BaseModelForm): new_image = forms.ImageField(required=False) def clean(self): return self.cleaned_data class Meta: model = Post fields = ('title','text', 'image', 'new_image', description') help_texts = { 'new_image': _('either upload a new image, or choose from the gallery') }
entonces nuestra vista donde se procesa
def post_new(request): if request.method == "POST": form = PostForm(request.POST, request.FILES) if form.is_valid(): post = form.save(commit=False) post.author = request.user post.slug=slugify(post.title) if form.cleaned_data.get('new_image'): image = Image(title=post.title, description=post.description, image = request.FILES['new_image']) image.save() post.image = image post.save() return redirect('post_detail', pk=post.pk) else: form = PostForm() return render(request, 'blog/post_edit.html', {'form': form})
Ahora, lo que debería estar haciendo es crear un nuevo objeto de imagen fuera del campo de formulario y luego guardarlo en la restricción de clave externa en el modelo de publicación. Pero lo que hace es nada, la publicación se carga bien con un campo de imagen en blanco y la imagen nunca se crea. Esto me hace pensar que la declaración if para 'new_image' se está resolviendo en False, pero no puedo entender por qué lo haría.
Además, por el bien de las convenciones, ¿debería suceder esto en la clase de formulario o en la clase de vista?
también, mi modelo de imagen
class Image(models.Model): title = models.CharField(max_length=200) description = models.TextField() image = models.ImageField(upload_to = 'images/', default = 'images/None/no-img.jpg') def __str__(self): return self.title
Necesitas cambiar
form = PostForm(request.POST)
para:
form = PostForm(request.POST, request.FILES)
necesita agregar request.FILES para cargar el archivo según la documentación
Documentación de Django: Carga de archivos
Es posible que desee utilizar señales de pre-guardado/post-guardado para crear la nueva imagen guardada cuando se guarda una publicación/imagen a través del formulario en el modelo de imagen.
Debe agregar su modelo de imagen a este ejemplo. Mirando cómo está guardando la información de la imagen a través del formulario, voy a asumir que no está usando el
ImageField()
modelo en su modelo de imagen. La única forma de saberlo es que muestres ese modelo también.
Documentación de Django: Referencia del campo del modelo: ImageField()
Este campo es cómo Django carga imágenes a través de formularios.
Es posible que deba agregar dos formularios a su vista, uno para la publicación y el otro para la carga de una nueva imagen.
Todavía estoy aprendiendo esto yo mismo, así que puedes mirar aquí y encontrar ayuda con esto.
La plantilla de formulario necesita esto: enctype="multipart/form-data", lo agregué y de repente ¡tenemos un procesamiento de imágenes funcional!