试图从DetailView用Ajax更新模型数据?

时间:2019-11-19 21:56:25

标签: django ajax

我想这样做:

我试图在详细视图上创建一个表单输入,该表单输入将更新详细模型实例的特定数据列(“状态”)。这是我的想法的图片: status update selector

选择器将显示当前状态,用户可以对其进行更改并从详细视图进行更新,而不必访问UpdateView。

我的想法是要发生这种情况: 1.在提交时,获取新用户输入的值。 2.获取当前详细类的模型实例 3.将模型实例属性分配为用户输入的值 4.保存模型实例

我已经尝试:我不知道这是否是最好的方法,但是我一直在尝试创建AJAX调用,主要是通过在线查找示例。

结果:终端显示提交后的帖子:“ [19 / Nov / 2019 17:50:33]” POST / task / edit / 4 HTTP / 1.1“ 200 41256”。但是,数据不会保存到数据库。刷新后,选择器将返回到先前保存的状态。
控制台显示:“脚本已连接”和“更新状态”,没有错误。提交后,警报显示成功消息:“ 127.0.0.1:8000表示状态已更新”。

Task_detail.html

<div class="deliv-box edit">
  <form id="status-update-form" method='POST' action='{% url "task_edit" task.pk %}'>
    {% csrf_token %}

    {{task_form.status}}

    <input id="status-update-btn" type="submit" value="Update Status" />
  </form>
</div>

...

<script type="text/javascript">

  var frm = $('#status-update-form');
  frm.submit(function () {
      console.log("script is connected")
      console.log($('#status-update-btn').val())
      $.ajax({
          type: frm.attr('method'),
          url: frm.attr('action'),
          data: frm.serialize(),
          success: function (data) {
              $("#deliv-box edit").html(data);
              alert("status updated");
          },
          error: function(data) {
              alert("error");
          }
      });
      return false;
  });

</script>

forms.py

class TaskForm(forms.ModelForm):
    class Meta:
        model = Task
        fields = "__all__"

views.py

class TaskDetail(ModelFormMixin, DetailView):
    template_name='task_detail.html'
    model = Task
    form_class = TaskForm

    def get_context_data(self, **kwargs):
        context = super(TaskDetail, self).get_context_data(**kwargs)
        context['task_form'] = self.get_form
        return context

    def update(request):
        if request.method=='POST':
            task_id = request.POST.get('id')
            task = Task.objects.get(pk = task_id)
            status_obj = request.POST.get('status')
            task.status = status_obj
            task.save()
            return JsonResponse({'status':'updated...'})
        else:
            return JsonResponse({'status':'not updated'})

谢谢。

1 个答案:

答案 0 :(得分:0)

您正在覆盖不存在的方法=index(filter(Global!C5:C243,A2= Global!A5:A243,Global!B5:B243 >= B1,Global!B5:B243 < C1),1) ,因此永远不会调用它。

您需要继承update而不是UpdateView和mixin。

DetailView

这是将只读(禁用)字段添加到表单的方法:

class TaskUpdateView(UpdateView):
    template_name='task_detail.html'
    model = Task
    form_class = TaskForm
    # you can use the line below instead of defining form_class to generate a model form automatically
    # fields = ('status', )

    def form_valid(self, form):
        post = form.save(commit=False)
        # do anything here before you commit the save
        post.save()
        # or instead of two lines above, just do post = form.save()
        return JsonResponse({'status':'updated...'})