Django - Создание запроса Ajax - PullRequest
       9

Django - Создание запроса Ajax

0 голосов
/ 20 сентября 2018

Мне трудно понять, как интегрировать этот запрос ajax в мое представление.Я все еще учусь интегрировать django с запросами ajax.

Мой первый вопрос: должен ли запрос ajax иметь собственный выделенный URL-адрес?

В моем случае я пытаюсь вызвать его на кнопке, чтобы предварительно сформировать фильтр (запрос преформ).зависит от того, что выбрано в шаблоне).Я реализовал это, используя только django, но он должен делать новый запрос каждый раз, когда пользователь вводит фильтр, который, как я знаю, не эффективен.

Я написал основную функцию, используя JQuery, чтобы убедиться, что связь существует.Всякий раз, когда пользователь изменяет параметр в поле выбора, он выводит значение на консоль.Как вы увидите ниже в представлении, я бы вызвал запрос ajax внутри этой функции представления, если это возможно или правильный способ сделать это.

JQuery - Обновлено

$("#temp").change( function(event) {
    var filtered = $(this).val();
    console.log($(this).val());
    $.ajax({
        url : "http://127.0.0.1:8000/req/ajax/", 
        type : "GET", 
        data : { 
            'filtered': filtered
        }, 
        dataType: 'json',

        success: function(data){
            console.log(data)
        },
        error: function(xhr, errmsg, err){
            console.log("error")
            console.log(error_data)
        }
    });

Views.py

def pending_action(request):
    requisition_status = ['All', 'Created', 'For Assistance', 'Assistance Complete', 'Assistance Rejected']
    FA_status = RequisitionStatus.objects.get(status='For Assistance')

    current_status = 'All'
    status_list = []

    all_status = RequisitionStatus.objects.all()
    status_list = [status.status for status in all_status]

    # This is where I am handling the filtering currently
    if request.GET.get('Filter') in status_list: 
        user_req_lines_incomplete = RequisitionLine.objects.filter(Q(parent_req__username=request.user) & Q(status__status=request.GET.get('Filter')))
        current_status = request.GET.get('Filter')
    else:
        user_req_lines_incomplete = RequisitionLine.objects.filter(parent_req__username=request.user).exclude(status__status='Completed')

    user_reqs = Requisition.objects.filter(par_req_line__in=user_req_lines_incomplete).annotate(aggregated_price=Sum('par_req_line__total_price'),
                                                                                                header_status=Max('par_req_line__status__rating'))
    return render(request, 'req/pending_action.html', { 'user_reqs':user_reqs, 
                                                        'user_req_lines_incomplete':user_req_lines_incomplete, 
                                                        'requisition_status':requisition_status, 
                                                        'current_status':current_status,
                                                        'FA_status':FA_status}) 

def filter_status(request):
    status = request.GET.get('Filter')
    data = {
        'filtered': RequisitionLine.objects.filter(Q(parent_req__username=request.user) & Q(status__status=status)),
        'current_status': status
    }
    return JsonResponse(data)

Urls.py

path('pending/', views.pending_action, name='pending_action')

1 Ответ

0 голосов
/ 21 сентября 2018

Во-первых: вы должны разделить шаблон на неизменяемую часть и часть, которую вы хотите изменить с помощью фильтра.

Второе: для вашей цели вы можете использовать render_to_string.Смотрите следующую ссылку https://docs.djangoproject.com/en/2.1/topics/templates/#usage

пример кода (views.py):

cont = {
    'request': request, #important key-value
    'your_models_instances': your_models_instances
}
html = render_to_string('your_filter_template.html', cont)
return_dict = {'html': html}
return JsonResponse(return_dict)

В вашем js-файле вам нужно определить относительный url "{% url 'name в вашем url-файле'%} "И в случае успеха вам нужно добавить следующую строку:

success: function(data){
  $(".filter-block").html(data.html);
}

Я надеюсь, это поможет вам!Удачи!

...