我正在Django开发一个应用程序,当我try 上传JPEG图像时遇到了一个问题,问题是这样的:

Internal Server Error: /publish_offer/
Traceback (most recent call last):
  File "C:\Users\G-FIVE\Desktop\Projects\revenue\venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\G-FIVE\Desktop\Projects\revenue\venv\Lib\site-packages\django\utils\deprecation.py", line 136, in __call__
    response = self.process_response(request, response)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\G-FIVE\Desktop\Projects\revenue\venv\Lib\site-packages\django\middleware\clickjacking.py", line 27, in process_response
    if response.get("X-Frame-Options") is not None:
       ^^^^^^^^^^^^
AttributeError: 'SafeString' object has no attribute 'get'
[19/Jun/2023 14:08:35] "POST /publish_offer/ HTTP/1.1" 500 66377

enter image description here

用PNG图像不会出现这种情况,我真的很困惑. 我将分享我的代码:

My Models:

class ImagenesOferta(models.Model):
    imagen = models.ImageField(verbose_name='Imagen Oferta', blank=False, null=False, upload_to='img_ofertas/')

    class Meta:
        verbose_name = 'Imagen de Oferta'
        verbose_name_plural = 'Imagenes de Ofertas'
        ordering = ['-id']

class Oferta(models.Model):
    titulo = models.CharField(verbose_name='Título', max_length=100, null=False, blank=False)
    descripcion = models.TextField(verbose_name='Descripción', null=True, blank=True)
    cantidad = models.PositiveSmallIntegerField(verbose_name='Cantidad', null=False, blank=False, default=1)
    valor = models.DecimalField(verbose_name='Valor', max_digits=3, decimal_places=2, null=False, blank=False)
    material = models.CharField(verbose_name='Material', max_length=20, null=False, blank=False, choices=MATERIAL_CHOICES)
    imagenes = models.ManyToManyField(ImagenesOferta, verbose_name='Imagenes de la Oferta', blank=True)
    usuario = models.ForeignKey(Usuario, verbose_name='Usuario', null=False, blank=False, on_delete=models.CASCADE)
    is_active = models.BooleanField(verbose_name='Activo/Inactivo', default=True)
    vendido = models.BooleanField(verbose_name='Vendido', default=False)
    fecha_creacion = models.DateTimeField(verbose_name='Fecha de Creación', auto_now_add=True)

    def __str__(self):
        return self.titulo

    class Meta:
        verbose_name = 'Oferta'
        verbose_name_plural = 'Ofertas',
        ordering = ['-fecha_creacion']

My view:

@login_required(login_url='login')
def publish_offer(request):

    form = formOferta()

    if request.method == 'POST':
        form = formOferta(request.POST, request.FILES)
        if form.is_valid():
            form.instance.usuario = request.user
            oferta = form.save()
            imgs = [
                ImagenesOferta(imagen=image)
                for image in request.FILES.getlist('imagenes')
            ]
            ImagenesOferta.objects.bulk_create(imgs)
            oferta.imagenes.add(*imgs)
            return redirect('home')
        else:
            return form.errors
        
    return render(request, 'publicar_oferta.html', {
        'form': form
    })

The input that I use to upload multiple images in my template:

                            <div class="mb-3">
                                <h5 class="text-center my-4">Añade Imagenes</h5>
                                <label for="imagenes" class="form-label">Cargar Imagenes</label>
                                <input class="form-control-file" type="file" id="imagenes" name="imagenes" multiple>
                            </div>

如果有人能帮我解决这个问题,我真的很感激!

推荐答案

在视图中不能返回form.errors:form.errorsSafeString,不是HpttResponse.您可以将结果包装在响应中:

from django.http import HttpResponse


@login_required(login_url='login')
def publish_offer(request):
    form = formOferta()
    if request.method == 'POST':
        form = formOferta(request.POST, request.FILES)
        if form.is_valid():
            # …
            return redirect('home')
        else:
            return HttResponse(form.errors, status_code=400)

    return render(request, 'publicar_oferta.html', {'form': form})

但是,您很可能只想让视图继续其流程,并使用显示错误的表单重新呈现模板:

from django.http import HttpResponse


@login_required(login_url='login')
def publish_offer(request):
    form = formOferta()
    if request.method == 'POST':
        form = formOferta(request.POST, request.FILES)
        if form.is_valid():
            # &hellip;
            return redirect('home')
        # no else

    return render(request, 'publicar_oferta.html', {'form': form})

请注意,在您的HTML<form>中,您应该指定enctype="multipart/form-data" [mdn-docs]来编码文件,以便POST请求可以处理这些文件.

Django相关问答推荐

Django-将html数据保存到quillfield中

Django测试:如何模拟Django_apps.get_Model()的LookupError

Django:作为模型中的列表元素的字段

如何根据状态计算表中数据的数量?

Pymongo:搜索文档时忽略空输入值

Django JSONField 过滤

如何从 django 自定义中间件类返回 rest_framework.response 对象?

Django - 如何在其管理模块中访问模型的详细名称?

Django admin:我可以定义字段顺序吗?

Heroku - 在 Django 应用程序中处理静态文件

Django:使用render或render_to_response时添加响应头

django 模板 if 或语句

Django Admin:如何在同一视图中显示来自两个不同模型的字段?

Django模型字段按变量

如何使用 django-nose 运行单个测试或单个 TestCase?

我应该如何在我的模型中使用 DurationField?

Django manage.py:在其依赖之前应用迁移

引发 404 并继续 URL 链

ProgrammingError: 安装 Psycopg2 后,关系django_session不存在错误

Django:必须使用对象 pk 或 slug 调用通用详细视图