【问题标题】:Django Forms - Processing GET RequestsDjango 表单 - 处理 GET 请求
【发布时间】:2011-09-22 11:08:19
【问题描述】:

我们有一个现有的 Django 表单,它接受 GET 请求以允许用户为他们生成的查询参数添加书签。该表单包含许多字段,其中大部分是必需的。该表单使用半标准样板来处理请求,用 GET 代替 POST:

if request.method == 'GET':
   form = myForm(request.GET)
   if form.isValid()
      # Gather fields together into query.
else
   form = myForm()

问题在于,第一次加载表单时,GET 请求中没有任何内容可用于填充必填字段,因此大多数表单都会显示“缺少字段”错误。

设置初始值不起作用;显然,GET 请求中不存在的值会覆盖它们。

我们如何避免这种情况?我很确定我们根本没有正确处理事情,但我找不到处理 GET 请求的表单示例。我们希望在用户在字段为空白或其他无效的情况下点击“提交”按钮时显示错误,但不希望在最初显示表单时显示这些错误。

【问题讨论】:

  • 为什么不直接使用 request.POST 和处理表单数据的标准方式?

标签: validation django-forms


【解决方案1】:

forms.Form 子类的位置参数通知 Django 你打算处理一个表单,而不是仅仅显示一个空白/默认表单。您的 if request.method == 'GET' 并没有做出您想要的区分,因为通过在 Web 浏览器中键入 URL 或单击链接的常规旧 Web 请求也是 GET 请求,因此 request.method 等于 GET 任何一种方式。

您需要一些区分机制,以便您可以区分表单显示和表单处理。

想法:

如果您的处理是通过。 AJAX,你可以使用if request.is_ajax() 作为你的条件。

或者,您可以包含一个GET 令牌,表示请求正在处理。在此示例中,首先您需要在表单中添加一些内容:

<input type="hidden" name="action" value="process_form" />

然后你可以在你的视图中寻找那个值:

if 'action' in request.GET and request.GET['action'] == 'process_form':
    form = myForm(request.GET)
    if form.is_valid():
        # form processing code
else:
    form = myForm()

我还将为您提供标准的样板点,即如果您可以提供帮助,通常最好不要使用 GET 进行表单处理(正是因为您遇到了这样的困难,因为您使用的是异常模式),但是如果你有一个真正需要它的用例,那么你真的需要它。你比我更了解你的需求。 :-)

【讨论】:

  • 可悲的是,在这种情况下我们真的需要它,据我的老板说。我们已经通过使用两个 URL 至少暂时解决了这个问题——第一个实例化表单,然后使用生成的 GET 请求调用第二个。第一个确保表单填充了其初始值,而第二个将 GET 参数传递给表单的 init 例程。不漂亮,但又快又容易。
  • 我没有出现足够长的时间来影响您的回复,但如果可能的话我会这样做。谢谢。
  • 公认的做法是“接受”它,我认为,如果您认为答案是正确的。
【解决方案2】:

如果您的干净页面加载没有任何非表单 ​​GET 参数,您可以在视图中区分干净页面加载和表单提交。而不是通常的

form = YourForm()
if request.POST:

你可以的

if request.GET.items():
    form = YourForm(request.GET)
    if form.is_valid():
        ...

else:
    form = YourForm()

如果您的干净页面加载可能有其他参数(例如电子邮件链接跟踪参数),您需要使用QueryDict methods 来测试您的任何表单参数是否在请求中。

【讨论】:

    【解决方案3】:

    当你第一次加载一个干净的表单时,request.GET 是空字典。提交表单后,request.GET 将使用您的字段数据填充,即使字段仅包含空数据。

    【讨论】:

      【解决方案4】:

      我的第一个问题是这个问题,我将其作为评论发布: 为什么不直接使用request.POST 和处理表单数据的标准方式?

      在考虑了这里的所有内容之后,您可能正在寻找一种处理查询字符串中的数据以填充表单的方法。您可以在不使用 request.GET 作为您的 form.data 的情况下做到这一点。

      在我自己的观点中,我利用我创建的一个实用函数将初始数据从request.GET 添加到表单,但我不打算在这里分享该函数。不过,这是签名。 initial_dict 通常是 request.GETmodel_forms 是单个 ModelFormModelForm 的列表。

      def process_initial_data(model_forms, initial_dict):
      

      尽管如此,我可以通过在发布表单时使用request.POST 的标准做法来处理表单。而且我不必在 URL 查询字符串中传递各种信息,也不必在用户输入信息时使用 JavaScript 对其进行修改。

      【讨论】:

        猜你喜欢
        • 2014-02-22
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多