带有两个提交按钮的 Django 表单。 . .一个需要字段,一个不需要
Django form with two submit buttons . . . one requires fields and one doesn't
我认为这应该是一个相当简单的问题。 . .我有一个带有两个不同提交按钮的 Django 表单。第一个提交按钮仅用于将表单字段中输入的任何值保存到数据库(以便用户可以稍后返回并根据需要完成表单)。我希望在单击第一个提交按钮时不需要表单字段。但是,当用户单击第二个提交按钮时,所有字段都应该是必填项。有没有办法做到这一点?还是我只需要为每个提交按钮复制一次表单?
如果您手动为提交按钮编写 HTML,您可以添加 Django 应用程序可以使用的 name
和 value
属性:
<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调用堆栈:
Views.py
收到 GET 请求并使用您的 Forms.py
表单初始化表单 class.
- 此时,您的所有字段都已创建并带有 'required' 属性。
- 当您单击一个按钮时,
Views.py
会收到一个 POST 请求。 更改 字段的 'required' 属性为时已晚,因为它们在 GET 请求初始化表单时已经设置好
- (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>
我认为这应该是一个相当简单的问题。 . .我有一个带有两个不同提交按钮的 Django 表单。第一个提交按钮仅用于将表单字段中输入的任何值保存到数据库(以便用户可以稍后返回并根据需要完成表单)。我希望在单击第一个提交按钮时不需要表单字段。但是,当用户单击第二个提交按钮时,所有字段都应该是必填项。有没有办法做到这一点?还是我只需要为每个提交按钮复制一次表单?
如果您手动为提交按钮编写 HTML,您可以添加 Django 应用程序可以使用的 name
和 value
属性:
<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调用堆栈:
Views.py
收到 GET 请求并使用您的Forms.py
表单初始化表单 class.- 此时,您的所有字段都已创建并带有 'required' 属性。
- 当您单击一个按钮时,
Views.py
会收到一个 POST 请求。 更改 字段的 'required' 属性为时已晚,因为它们在 GET 请求初始化表单时已经设置好 - (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>