我有一个表单,允许用户选择几个参数来允许分面查询数据。由于此处没有数据输入,我希望表单发布到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数据的最佳方法是什么?
任何帮助都非常感激。
答案 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的模板进行更改。