Django/Python控制:"if form.is_valid():“如果表单有输入类型button,则等

Django/Python control: "if form.is_valid ():" is equal to false if the form has an input type "button"

本文关键字:表单 如果 类型 则等 button 输入 控制 Python quot Django is      更新时间:2023-09-26

我不明白为什么如果我在我的html页面的形式:<input type="submit" class="btn btn-small btn-primary" id="execute" value="Esegui"> '

则该表单有效,否则如果我输入a<input class="btn btn-small btn-primary" type="button" id="execute"价值= " Esegui ">表格无效。问题是,如果我把"输入类型",那么提交就无法加载JSON的代码:

<script type="text/javascript">
$(document).ready(function () {
    $("a # single_image").fancybox();
    $("# execute").click(function () {
        var execute = true
        $("# execute").attr("value", "Run ...");
        $("# single_image.") attr("href", "");
        $("# image").attr("src", "");
        $.ajax({
            type: "POST",
            url: "/ cloud / carica_immagine"
            date: {
                execute: execute
            }
        }).done(function (msg) {
            $("# execute").attr("value", "Run");
            $("# single_image.") attr("href", "graphs /" + msg["user_id"] + "/" + msg["graph"] + ."png");
            $("# image").attr("src", "graphs /" + msg["user_id"] + "/" + msg["graph"] + ."png");
            $("# single_image.") trigger("click");
        });
    });
})
</ script>.

这是我的视图,被html页面调用:

def list(request):
    # Handle file upload
    documents = Document.objects.all()
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Document(docfile = request.FILES['docfile'])
            print newdoc.docfile
            newdoc.save() 
            ...
            ...
            return render_to_response('processa_immagine.html', {'documents':documents, 'form': form, 'user_id':request.session['user_id'],'graph':graph}, RequestContext(request))
    else:
        form = DocumentForm() # A empty, unbound form        
    # Render list page with the documents and the form
    return render_to_response('processa_immagine.html', {'documents':documents, 'form': form}, RequestContext(request))

这是我的表单:

class DocumentForm(forms.Form):
    docfile = forms.FileField(
        label='Seleziona un file',help_text='massimo 42 megabytes',
    )

这是我的模型:

class Document(models.Model):
    docfile = models.FileField(upload_to='documents')

my page HTML with form is:

<form method="post" id="myform" enctype="multipart/form-data">
  <p>{{ form.docfile.label_tag }} {{ form.docfile.help_text }} </p>
  <p>{{ form.docfile }}</p>             
  <input class="btn btn-small btn-primary" type="button" id="execute" value="Esegui"><br/> 
</form>
我希望有人能帮助我。

这段代码很混乱。您已经在单击事件触发的按钮上定义了一个Ajax函数。因此,当您单击按钮时,该函数被触发,并尝试提交表单。但是,它不能以使表单有效的方式这样做:表单中的唯一字段是必需的FileField,它不能通过标准的Ajax POST提交—即使可以,Ajax函数也不会尝试实际包含它。

input版本似乎有效的原因是Javascript不阻止默认的提交操作,所以过程是这样的:Ajax运行,但甚至在它有机会收到响应之前,整个页面被提交,并刷新(有效)表单提交的结果。