AttributeError at /sign-up and /sign-in 'WSGIRequest' object has no attribute 'is_ajax'

Я получаю эту проблему, любая помощь будет оценена по достоинству, Я получаю ошибку при попытке войти в систему или зарегистрироваться.Error bellow. AttributeError at /sign-up 'WSGIRequest' object has no attribute 'is_ajax' I know that function is depreciated now, but i can't seem to fix the issue.

mixins.py

class AjaxFormMixin(object):

    '''
    Mixin to ajaxify django form - can be over written in view by calling form_valid method
    '''

    def form_invalid(self, form):
        response = super(AjaxFormMixin, self).form_invalid(form)
        if self.request.is_ajax():
            message = FormErrors(form)
            return JsonResponse({'result': 'Error', 'message': message})
        return response

    def form_valid(self, form):
        response = super(AjaxFormMixin, self).form_valid(form)
        if self.request.is_ajax():
            form.save()
            return JsonResponse({'result': 'Success', 'message': ""})
        return response

views.py

Я знаю, что есть пост с похожей проблемой, но я вроде как пытаюсь исправить это на своей стороне. screenshot

По состоянию на , метод .is_ajax() [Django-doc] был устаревшим. Действительно, в release notes мы видим:

Метод HttpRequest.is_ajax() устарел, так как он полагался на специфический для jQuery способ обозначения AJAX-вызовов, в то время как в настоящее время, как правило, используется JavaScript Fetch API. В зависимости от вашего случая использования, вы можете либо написать свой собственный метод определения AJAX, либо использовать новый метод HttpRequest.accepts(), если ваш код зависит от HTTP-заголовка Accept клиента.

Первоначально он использовал:

def is_ajax():
     return request.headers.get('x-requested-with') == 'XMLHttpRequest'

Но обратите внимание, что это является и всегда было чем-то специфическим для jQuery, и поэтому это не имеет особого смысла: браузер или HTTP библиотека всегда могут имитировать это поведение, и вы можете делать AJAX запросы без этого заголовка, и поэтому это не надежно.

Вы можете проверить, принимает ли браузер json/xml с помощью .accepts(…) [Django-doc], что, вероятно, является тем, что AJAX запрос попытается принять, так:

self.request.accepts('application/json')

или:

self.request.accepts('application/xml')

являются вероятными кандидатами для этого.

Используйте его как if request.headers.get('x-requested-with') == 'XMLHttpRequest': везде так:

def profile_view(request):
    '''
    function view to allow users to update their profile
    '''
    user = request.user
    up = user.userprofile

    form = UserProfileForm(instance=up)

    if request.headers.get('x-requested-with') == 'XMLHttpRequest':
        form = UserProfileForm(data=request.POST, instance=up)
        if form.is_valid():
            obj = form.save()
            obj.has_profile = True
            obj.save()
            result = "Success"
            message = "Your profile has been updated"
        else:
            message = FormErrors(form)
        data = {'result': result, 'message': message}
        return JsonResponse(data)

    else:

        context = {'form': form}
        context['google_api_key'] = settings.GOOGLE_API_KEY
        context['base_country'] = settings.BASE_COUNTRY

        return render(request, 'users/profile.html', context)

Для представлений на основе классов используйте его как if self.request.headers.get('x-requested-with') == 'XMLHttpRequest':

Вернуться на верх