【问题标题】:Django form validation with GET使用 GET 进行 Django 表单验证
【发布时间】:2012-02-22 16:46:25
【问题描述】:

我有一个表单,它允许用户选择多个参数以允许对数据进行多面查询。由于此处没有数据输入,我希望将表单发布到 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 数据的最佳方法是什么?

非常感谢任何帮助。

【问题讨论】:

    标签: django forms get


    【解决方案1】:

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

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

    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)
    

    搜索.html

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我知道绑定的表单(数据)将在我的搜索视图中通过验证,只是不确定表单验证时该怎么做 - 使用传递的 GET 数据重定向到结果视图?
      • 不,结果视图本身接收 GET 数据。搜索视图上表单上的操作应该是指向结果视图的链接。在结果视图中,您像在搜索视图中一样实例化表单,但这次您以request.GET 的形式传入data。检查表单是否有效,然后正常呈现结果。
      • 好的。如果表单无效 - 我是重定向回搜索视图以显示验证错误还是在结果页面中显示错误的表单?
      • 您必须在结果视图中执行此操作,因为这是错误所在。如果您重定向回搜索页面,您将丢失该信息。这就是为什么表单处理通常在同一个视图中完成的原因。那么,错误就变成了另一个逻辑分支。
      • 好的。所以我现在让它工作。我的表单指向results 视图。如果有效,数据将被处理并显示在results.html 模板中。如果数据无效,request.GET 将保存到会话变量并重定向回带有标志的search 视图(类似于'/search/?errors=true'),其中可以显示绑定的表单。我欢迎任何关于为什么这可能是不好的做法的建议。
      【解决方案3】:

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

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

      或使用 jQuery

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

      checkForm() 在成功验证时返回 true,否则返回 false。 (注意,如果不返回false,表单提交会照常进行。)

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

      【讨论】:

      • 客户端验证是一个很好的除了服务器端验证,但它不能取代它。如果您完全依赖客户端验证,就会遇到问题。
      • @Chris 我同意,但他似乎要求“让用户明白”(即客户端)功能。
      • 好的,我知道 javascript 会起作用,但我虽然在 Django(服务器端)中可能有一些方法,因为我觉得通过 GET 提交表单数据到另一个 url 应该是常见的任务。
      • @Darwin 我想您可以进行 ajax 调用,然后在服务器端验证器通过输入时提交表单。就个人而言,我认为对于大多数应用程序来说效率很低,但我不知道你的情况。
      • 嗯。我仍然不相信客户端方法(至少也没有服务器端解决方案)。在视图中使用 GET 验证表单是否存在根本性错误?我的意思是,我可以在 request.session 中验证并保存 GET 数据吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2021-10-13
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      相关资源
      最近更新 更多