带有两个提交按钮的 Django 表单。 . .一个需要字段,一个不需要

Django form with two submit buttons . . . one requires fields and one doesn't

我认为这应该是一个相当简单的问题。 . .我有一个带有两个不同提交按钮的 Django 表单。第一个提交按钮仅用于将表单字段中输入的任何值保存到数据库(以便用户可以稍后返回并根据需要完成表单)。我希望在单击第一个提交按钮时不需要表单字段。但是,当用户单击第二个提交按钮时,所有字段都应该是必填项。有没有办法做到这一点?还是我只需要为每个提交按钮复制一次表单?

如果您手动为提交按钮编写 HTML,您可以添加 Django 应用程序可以使用的 namevalue 属性:

<button name="action" value="save">Save</button>
<button name="action" value="submit">Submit</button>

提交表单后,您将能够知道用户打算执行的操作。

class MyForm(forms.Form):

    def __init__(self, data=None, *args, **kwargs):
        super(MyForm, self).__init__(data=data, *args, **kwargs)

        # store user's intended action in self.action
        self.action = data.get('action') if data else None

        # set form fields to be not required if user is trying to "save"
        if self.action == 'save':
            for field in self.fields:
                field.required = False

上面的答案有效,但我更喜欢这种方式:

我有两个按钮:

<!-- simply saves the values - all fields aren't required unless the user is posting the venue -->
<input type="submit" name="mainForm" value="Save">

<!-- post the values and save them to the database - fields ARE required-->
<input type="submit" name="postVenue" value="Post Venue">

我默认将所有表单字段设置为 required=False,然后在我的视图中显示:

if 'postVenue' in request.POST:
    form = NewVenueForm(request.POST)
    form.fields['title'].required = True
    form.fields['category'].required = True
    # do this for every form field
                          
elif 'mainForm' in request.POST:     
    form = NewVenueForm(request.POST)

谢谢大家!!

这在技术上不应该使用 'required' 字段属性,因为 Django 字段在表单初始化时设置为 optional/required。

让我们看看django调用堆栈:

  1. Views.py 收到 GET 请求并使用您的 Forms.py 表单初始化表单 class.
  2. 此时,您的所有字段都已创建并带有 'required' 属性。
  3. 当您单击一个按钮时,Views.py 会收到一个 POST 请求。 更改 字段的 'required' 属性为时已晚,因为它们在 GET 请求初始化表单时已经设置好
  4. (POST-请求 return 重定向或新表单)

如果您尝试更改 POST 请求中的 'required' 属性 并且 该字段为空, 您的表单将无效(也就是当你调用form.is_valid()时它会return False)。

警告: 那么唯一可能的解决方法是检查 POST 请求中的字段并使用 Django message 但不推荐这样做,因为它破坏了 Django 架构,迫使您重新加载表单(而不是重定向)并丢失用户提交的数据。

更新:

在 jquery 中可以通过使用隐藏的提交按钮和常规的可见按钮来完成此操作。常规按钮 onClick 调用 jquery 设置您想要的任何字段,然后触发隐藏的提交按钮。

<head>
  <meta charset="utf-8" />
  <script data-require="jquery" data-semver="2.1.4" src="http://code.jquery.com/jquery-2.1.4.min.js"></script>
  <script>
    const allFields = [''] //put all your field ids here

    $("#tableAdd").click(function () {

      // Set all your fields back to optional
      allFields.forEach(function(field) {
          $( "#" + field ).removeAttr('required');
      });

      // Set specific fields as required, 'manufacturer_date' being the field 'table_add' requires
      var requiredFields = ['manufacturer_date'];
      requiredFields.forEach(function(field) {
          $( "#" + field ).attr('required', '');
      });

      // Then trigger the hidden input field to submit the form and send the POST request
      $( "#table_add" ).trigger( "click" );

    });
  </script>
</head>

<body>
  <input id="manufacturer_date" type="date">
  <input type="button" id="tableAdd" value="Add">
  <input type="submit" name="table_add" id="table_add" hidden>
</body>