首页 文章

使用GET进行Django表单验证

提问于
浏览
1

我有一个表单,允许用户选择几个参数,以允许分面查询数据 . 由于此处没有数据输入,我希望表单发布到GET,我有另一个视图,其中有一个显示结果的不同模板 .

我希望表单正常验证,以便在未完成必填字段时显示相应的错误 . 目前我的流程看起来像这样(简化):

我的搜索视图:

def search(request):
    ...
    context['form'] = GraphForm()
    ...
    return render(request, 'search.html', context)

我的结果观点:

def results(request):
    if 'submit' in request.GET:
        # process GET variables as query
    ...
    return render(request, 'results.html', context)

我的 search.html 模板:

<form action="{% url results %}" method="get">{% csrf_token %}
{% for field in form %}
<div class="field_wrapper">
    {{ field.errors }}
    {{ field.label_tag }} {{ field }}
</div>
{% endfor %}
<input type="submit" name="submit" value="Query"  />
</form>

鉴于表单提交给具有单独视图代码的另一个URL,验证(突出显示错误)以及确保我拥有GET数据的最佳方法是什么?

任何帮助非常感谢 .

3 回答

  • 2

    这可能有点晚了,但我认为以下内容可以在保持与“POST”工作流程的相似性的同时起作用:

    只需拥有一个视图,而不是有两个不同的视图来搜索和显示结果 . 然后可以遵循为帖子表格描述的normal codepath . 我们使用 'submit' in request.GET 而不是使用 request.method == 'POST' 来检测表单提交 . 如果使用javascript提交表单,请确保'submit'包含在GET数据中或使用隐藏字段来检测表单提交 .

    views.py

    def search(request):
        context_dict = {}
        if 'submit' in request.GET:
            form = GraphForm(request.GET)
            if form.is_valid():
                #do search and add results to context
                #If you don't want to use a single view, 
                # you would redirect to results view here.
                results = get_results(**form.cleaned_date)
                context_dict['results'] = results
        else:
            form = GraphForm()
        context_dict['form'] = form
        return render(request, 'search.html', context_dict)
    

    search.html

    <form action="{% url 'search' %}" method="get">
        {{form}}
        <input type="submit" name="submit" value="Query"  />
    </form>
    {% if results %}
        {% include 'results.html' %}
    {% endif %}
    
  • 1

    您应该能够像 request.POST 一样将 request.GET 传递给表单 . 表单只接受 data 字典 . 它并不关心它来自哪里 . 你已经试过了吗?

  • -2

    使用JavaScript / jQuery进行表单验证 . 您需要做的就是为 form 添加一个id,并在相应的Javascript中执行类似的操作

    document.getElementById("#form").onsubmit = checkForm();
    

    或者使用jQuery

    $("#form").submit(checkForm);
    

    其中 checkForm() 在成功验证后返回true,否则返回false . (请注意,如果您不返回false,表单提交将照常继续 . )

    您检查/验证哪些字段也可以使用Django的模板进行更改 .

相关问题