• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

617
Views
Django ImageField en formularios que no se cargan, funciona desde el administrador pero no desde el formulario

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
about 3 years ago · Santiago Trujillo
2 answers
Answer question

0

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.

about 3 years ago · Santiago Trujillo Report

0

La plantilla de formulario necesita esto: enctype="multipart/form-data", lo agregué y de repente ¡tenemos un procesamiento de imágenes funcional!

about 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error