#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 , хотя ваш ответ правильный: