使用GET进行Django表单验证

时间:2012-02-22 16:46:25

标签: django forms get

我有一个表单,允许用户选择几个参数来允许分面查询数据。由于此处没有数据输入,我希望表单发布到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 个答案:

答案 0 :(得分:2)

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

只需拥有一个视图,而不是有两个不同的视图来搜索和显示结果。然后可以遵循为帖子表格描述的normal codepath。我们不使用request.method == 'POST'来检测表单提交,而是使用'submit' in request.GET。如果使用javascript提交表单,请确保“提交”包含在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 :(得分:1)

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

答案 2 :(得分:-2)

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

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

或使用jQuery

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

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

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