微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 form_class 的 UpdateView 从 POST

如何解决带有 form_class 的 UpdateView 从 POST

我想知道用户点击了哪个提交输入。提交的表单转到使用 UpdateViewModelForm。我已将 name 属性添加到提交输入中,但是当我在 if 'approve' in self.request.POST: 内执行 get_context_data() 时,它是 False。我覆盖了 def post() 并且 approvePOST 字典中的一个键。有没有办法让 approvedecline 显示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 个字段,名为 approvedecline。每个都是不需要的 CharField 并包含一个 TextInput 小部件,其属性具有 {'type': 'submit','value': 'Approve'}(不是完全需要,但如果您只是在模板)。

这样做不仅会显示在 {{ form.approve }} 内的 self.request.POST 中点击提交,而且还会显示更有用的 get_context_data()

form_valid()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。