使用AJAX的Django CreateView

时间:2018-02-12 21:05:11

标签: jquery ajax django

我想在Django中使用AJAX通过通用视图和模态创建,更新和删除对象。 Django的官方文档讨论了AjaxableResponseMixin并显示了这段代码:

from django.http import JsonResponse
from django.views.generic.edit import CreateView
from myapp.models import Author

class AjaxableResponseMixin:
    """
    Mixin to add AJAX support to a form.
    Must be used with an object-based FormView (e.g. CreateView)
    """
    def form_invalid(self, form):
        response = super().form_invalid(form)
        if self.request.is_ajax():
            return JsonResponse(form.errors, status=400)
        else:
            return response

    def form_valid(self, form):
        # We make sure to call the parent's form_valid() method because
        # it might do some processing (in the case of CreateView, it will
        # call form.save() for example).
        response = super().form_valid(form)
        if self.request.is_ajax():
            data = {
                'pk': self.object.pk,
            }
            return JsonResponse(data)
        else:
            return response

class AuthorCreate(AjaxableResponseMixin, CreateView):
    model = Author
    fields = ['name']

(我的模特看起来像这样) 但是,我不明白如何在模态中实现它。 我确实有这个表格,我目前正在使用它,但它是一个网页,而不是模式:

  <form method="post" novalidate>
    {% csrf_token %}
    {% include 'includes/form.html' %}
    <button type="submit" class="btn btn-success">AJouter</button>
  </form>

有没有一种简单的方法可以使用一些ajax和jquery在模态中实现它?

1 个答案:

答案 0 :(得分:0)

我使用fetch代替Ajax。 javascript的新ES6中的这种用法承诺。 这是我的代码

async function saveMateriaPrima(event) {
  console.log('Guardando producto');

  event.preventDefault();
  let dataForm = new FormData(formMatPrima)
  let url = formMatPrima.action

  fetch(url, {
    method: 'POST',
    body: dataForm
  })
  .then(function(response){
    console.log(response);

    if(response.ok){
      let producto = document.getElementById('id_nombre').value
      console.log(`${producto} guardado correctamente.`);

      document.getElementById('id_nombre').value = ''
      $('#modal-crearmateriaprima').modal('hide')

    }else{
      throw "Error en la llamada Fetch"
    }
  })
  .catch(function(err){
    console.log(err);    
  })
}

它可以与您的代码一起使用,但是我无法获取新对象的pk。 希望对您有所帮助,并且可以改进此代码以获取pk数据。