Создайте URL-адрес django с результатами ajax

#ajax #django #django-templates

#ajax #django #django-шаблоны

Вопрос:

Я использую AJAX для обновления таблицы в моем шаблоне с помощью DataTable. Когда я получаю результаты от вызова AJAX (json), я использую «столбцы» для установки каждой строки. В одной из строк я хочу создать URL-адрес Django для другого представления.

То, что я пробовал до сих пор, похоже, не работает

 function refreshData(event_ref) {
    var table = $('#datatable').dataTable({
        'processing': true,
        'serverSide': false,
        'responsive': true,
        'destroy': true,
        'ajax': {   
            'type': "GET",
            'url': "{% url 'events:index' %}",
            'dataSrc': ""
        },
        'columns': [
            { "data": "pk", render: function (pk) { return '<input type="checkbox" id="check_'   pk   '" name="check_all">'} },
            { "data": "fields.date_time" },
            { "data": "pk", render: function (pk) { return "<a href='{% url 'events:event' "   pk   "%}'>Click me</a>" }} 
        ],
        'order': [[ 2, "desc" ]],
        'columnDefs': [ {
            'targets': [0, 8], // column index (start from 0)
            'orderable': false, // set orderable false for selected columns
        }],
        'scroller': {
            loadingIndicator: true
        }
    });
}

  

Проблема в строке

 { "data": "pk", render: function (pk) { return "<a href='{% url 'events:event' "   pk   "%}'>Click me</a>" }} 
  

и что я получаю, это
обратное значение для ‘event’ с аргументами ‘(‘ pk ‘,)’ не найдено. Попробовано 1 шаблон (ы): [‘события / событие/(?P[0-9] )/’]

Мой urls.py файл — это

 url('event/(?P<event_id>[0-9] )/', views.event, name='event'),
  

и мой view.py неужели это

 def index(request):

    latest_event_list = events.objects.order_by('-date_time')

    if request.is_ajax():
        json = serializers.serialize('json', latest_event_list)
        return HttpResponse(json, content_type='application/json')

    template = loader.get_template('events/index.html')

    context = {
        'app_name': "events",
        'page_name': "real-time",
        'latest_event_list': latest_event_list,
        'total_events': len(latest_event_list)
    }
    return HttpResponse(template.render(context, request))

def event(request, event_id):

    latest_event_list = events.objects.order_by('-date_time')[:5]
    template = loader.get_template('events/event.html')
    context = {
        'app_name': "events",
        'page_name': "archive",
        'latest_event_list': latest_event_list,
    }

    return HttpResponse(template.render(context, request))

  

Как я могу создать URL-адрес Django со значением из вызова AJAX?

Ответ №1:

Прежде всего, передача аргументов {% url %} тегу шаблона не выполняется путем добавления строки, чтобы получить нужный URL-адрес в шаблоне, вы делаете:

 {% url 'events:event' event_id=pk %}
  

Во-вторых, любой тег шаблона, который вы используете в своем HTML, интерпретируется Django во внутренней части один раз при визуализации HTML-страницы. То есть до того, как он попадет в браузер и начнет работать javascript (интерфейс). Итак, то, что вы делаете, не имеет смысла, потому что вы хотите, чтобы javascript динамически изменял URL-адрес в кнопке.

Если вы посмотрите на источник вашего HTML в вашем браузере, вы увидите, что там нет тега шаблона.

Итак, вам нужно создать URL-адрес в javascript. Что вы могли бы сделать, это создать переменную javascript в вашем шаблоне, которая "{% url 'events:event' event_id=1 %}" (которая в HTML-файле, анализируемом браузером, будет events/event/1 , а затем, используя манипуляции со строками, замените «1» значением pk .

Комментарии:

1. Вы правы, javascript — это язык интерфейса, спасибо, что помогли мне

Ответ №2:

вы обнаруживаете ошибку, потому что вызываете tag, когда pk не определен, поэтому вы можете исправить это, используя некоторый базовый URL, а затем заменить pk на текущее значение, например:

 {
  var base_url = "{% url 'events:event' 0 %}";
  var url = base_url.substring(0, base_url.lastIndexOf('/')  1 )   pk;
  return "<a href='"   url   "'>Click me</a>" 
}
  

Комментарии:

1. Я бы предпочел использовать replace вместо substring , хотя ваш ответ правильный: