Создать Django URL с результатами AJAX - PullRequest
1 голос
/ 10 апреля 2019

Я использую 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>" }} 

и вот что я получаю, Реверс для 'события' с аргументами '(' + pk + ',)' не найден.Попробован 1 шаблон (ов): ['events / event / (? 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?

Ответы [ 2 ]

2 голосов
/ 10 апреля 2019

Прежде всего, передача аргументов в тег шаблона {% 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.

0 голосов
/ 10 апреля 2019

вы ловите ошибку, потому что вызываете тэг, когда 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>" 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...