How do I integrate Ajax with Django applications?

前端 未结 8 584
忘了有多久
忘了有多久 2020-11-22 06:16

I am new to Django and pretty new to Ajax. I am working on a project where I need to integrate the two. I believe that I understand the principles behind them both, but have

8条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-22 06:27

    I have tried to use AjaxableResponseMixin in my project, but had ended up with the following error message:

    ImproperlyConfigured: No URL to redirect to. Either provide a url or define a get_absolute_url method on the Model.

    That is because the CreateView will return a redirect response instead of returning a HttpResponse when you to send JSON request to the browser. So I have made some changes to the AjaxableResponseMixin. If the request is an ajax request, it will not call the super.form_valid method, just call the form.save() directly.

    from django.http import JsonResponse
    from django import forms
    from django.db import models
    
    class AjaxableResponseMixin(object):
        success_return_code = 1
        error_return_code = 0
        """
        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(AjaxableResponseMixin, self).form_invalid(form)
            if self.request.is_ajax():
                form.errors.update({'result': self.error_return_code})
                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).
            if self.request.is_ajax():
                self.object = form.save()
                data = {
                    'result': self.success_return_code
                }
                return JsonResponse(data)
            else:
                response = super(AjaxableResponseMixin, self).form_valid(form)
                return response
    
    class Product(models.Model):
        name = models.CharField('product name', max_length=255)
    
    class ProductAddForm(forms.ModelForm):
        '''
        Product add form
        '''
        class Meta:
            model = Product
            exclude = ['id']
    
    
    class PriceUnitAddView(AjaxableResponseMixin, CreateView):
        '''
        Product add view
        '''
        model = Product
        form_class = ProductAddForm
    

提交回复
热议问题