You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTMX表单搭配Django无法成功上传文件的问题排查

问题:Django+HTMX上传文件时response.FILES为空

我编写了如下Django表单、HTMX代码和视图函数,当用户上传文件并提交表单时,文件信息出现在response.POST中,但response.FILES为空,请问这可能是什么原因?

Django表单代码

class FormCotacao(forms.Form):
    descricao = forms.CharField(
        label = 'Descrição',
        max_length = 200,
        required = True
    )
    valor1 = forms.FloatField(
        label = "Valor 1 (R$)",
        required = True
    )
    orcamento1 = forms.FileField(
        label = "Orçamento 1",
        widget = forms.FileInput(attrs={'accept': '.pdf, .xls, .xlsx'}),
        required = True
    )

HTMX表单代码

{% load crispy_forms_tags %}
<form method="post" enctype="multipart/form-data" hx-enconding="multipart/form-data" action="">
    {% csrf_token %}
    {{ form|crispy }}
    <input type="hidden" name="id" value="{{ orcamento.id }}">
    <input type="hidden" name="acao" value="addItemCotacao">
    <button type="button" class="btn btn-secondary" hx-get="{% url 'visualizar-orcamento' id %}" hx-swap="innerHTML" hx-target="#itemsAdicionados">Cancelar</button>
    <button type="submit" hx-post="{% url 'item-cotacao' id %}" hx-swap="innerHTML" hx-target="#itemsAdicionados" class="btn btn-primary" name="addItemCotacao">Salvar item</button>
</form>

视图函数代码

def orcamentoCotacao(response, id):

    usuario = response.user
    orcamento = Orcamento.objects.get(id=id)

    if orcamento.aprovado != True:

        if response.method == 'POST':
            form = FormCotacao(response.POST)
            arquivos = response.FILES
            if form.is_valid():
                pass
        else:
            form = FormCotacao()
            context = {
                'form': form,
                'id': id
            }
            return render(response, "main/partials/item-cotacao.html", context)

原因与修正方案

1. HTMX属性拼写错误

你在表单里写的hx-enconding是拼写错误,正确属性名是hx-encoding(少了一个字母i)。这个属性用于告诉HTMX处理多部分表单数据,拼写错误会导致HTMX无法正确识别文件上传逻辑,最终文件数据无法进入response.FILES。

修正:
将表单中的hx-enconding="multipart/form-data"改为hx-encoding="multipart/form-data"。

2. 表单初始化未传入FILES

视图的POST分支中,初始化FormCotacao时只传入了response.POST,没有传入response.FILES。Django表单要处理文件字段,必须同时接收POST数据和FILES数据,否则文件字段无法被解析,response.FILES会为空。

修正:
将form = FormCotacao(response.POST)改为:

form = FormCotacao(response.POST, response.FILES)

3. 额外检查点

确保form标签的enctype="multipart/form-data"属性没有被其他代码覆盖,配合正确的hx-encoding属性,才能保证文件上传流程正常。


内容的提问来源于stack exchange,提问作者Mateus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 00:37:33