如何解决带有 form_class 的 UpdateView 从 POST
我想知道用户点击了哪个提交输入。提交的表单转到使用 UpdateView
的 ModelForm
。我已将 name 属性添加到提交输入中,但是当我在 if 'approve' in self.request.POST:
内执行 get_context_data()
时,它是 False。我覆盖了 def post()
并且 approve
是 POST
字典中的一个键。有没有办法让 approve
或 decline
显示在 get_context_data()
中?
猜测它必须与所涉及的 ModelForm 有关,但是有没有一种方法可以在不覆盖 post 方法的情况下通过它,或者我应该将其排除在外?
仅供参考,我省略了一些只是臃肿且与问题无关的代码。如果里面有什么不合理的地方,我们深表歉意。
models.py
class DeFinition(DeFinitionInfo):
SEV3 = 'info'
SEV2 = 'warning'
SEV1 = 'danger'
sup_sevs = (
('','Please select'),(SEV3,'Sev3'),(SEV2,'Sev2'),(SEV1,'Sev1'),)
title = models.CharField(max_length=255)
description = models.TextField(null=True,blank=True)
resolution = models.TextField(null=True,blank=True)
sup_sev = models.CharField(max_length=7,choices=sup_sevs,null=False,blank=False)
forms.py
class DeFinitionForm(forms.ModelForm):
class Meta:
model = DeFinition
fields = ['title','sup_sev','description','resolution']
widgets = {
'description': forms.Hiddeninput(),'resolution': forms.Hiddeninput(),}
views.py
class DeFinitionUpdate(LoginrequiredMixin,UpdateView):
model = DeFinition
context_object_name = 'deFinition'
form_class = DeFinitionForm
template_name_suffix = '_form'
success_url = reverse_lazy('deFinitions:index')
def get_context_data(self,**kwargs):
context = super().get_context_data(**kwargs)
if self.request.method == 'POST':
print(f'Post data: {self.request.POST}')
return context
update_form.html
<form id="defForm" class="container-sm w-50" enctype="multipart/form-data" method="post" action=".">
{% csrf_token %} {{ form.delete }}
<div class="row g-3">
<div class="col-md-10">
<div class="form-floating mb-3">
<input type="text" class="form-control form-control-sm bg-dark text-light" id="{{ form.title.auto_id }}" name="{{ form.title.html_name }}" placeholder="Enter title here..." value="{{ form.title.value|default_if_none:'' }}">
<label class="form-label" for="{{ form.title.id_for_label }}">Title</label>
</div>
</div>
<div class="col-sm">
<div class="form-floating mb-3">
{{ form.sup_sev }}
<label class="form-label" for="{{ form.sup_sev.id_for_label }}">Severity</label>
</div>
</div>
</div>
<div class="form-floating mb-3">
{{ form.description }}
<div id="description" class="form-control form-control-sm bg-dark text-light d-inline-block" style="white-space: pre-wrap;" contentEditable>{{ form.description.value|default_if_none:'' }}</div>
<label class="form-label" for="{{ form.description.id_for_label }}">Description</label>
</div>
<div class="form-floating mb-3">
{{ form.resolution }}
<div id="resolution" class="form-control form-control-sm bg-dark text-light d-inline-block" style="white-space: pre-wrap;" contentEditable>{{ form.resolution.value|default_if_none:'' }}</div>
<label class="form-label" for="resolution">Resolution</label>
</div>
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
<input id="decline" class="btn btn-outline-danger" name="decline" type="submit" value="Decline">
<input id="approve" class="btn btn-outline-success" name="approve" type="submit" value="Approve">
</div>
</form>
解决方法
所以经过一段时间后,我解决了它。
首先我发现我有一个使用 $(this).submit();
提交表单的 Jquery 脚本。这当然意味着它不是提交它的提交输入。因此,只需删除它和 preventDefault();
就可以了。下面是罪魁祸首。它将文本复制到相对隐藏的输入。 (所以我有一个自动调整大小的文本区域,但仍将信息发送到服务器)
$(document).ready(function() {
let form = $('#defForm')
let descDiv = $("#description");
let resoDiv = $('#resolution');
form.one('submit',function(e) {
// e.preventDefault();
let descTa = $("#id_description");
let resoTa = $("#id_resolution");
descTa.val(descDiv.text());
resoTa.val(resoDiv.text());
//$(this).submit();
});
});
第二个原因是我需要在表单中进行一些额外的配置。
我向 ModelForm
添加了 2 个字段,名为 approve
和 decline
。每个都是不需要的 CharField
并包含一个 TextInput
小部件,其属性具有 {'type': 'submit','value': 'Approve'}
(不是完全需要,但如果您只是在模板)。
这样做不仅会显示在 {{ form.approve }}
内的 self.request.POST
中点击提交,而且还会显示更有用的 get_context_data()
。
form_valid()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。