Так что я довольно новичок в Django и Javascript (я использую JQuery), и мне интересно, если я делаю хак или есть более удобные способы отправки идентификаторов базы данных на стороне клиента на серверную часть django , Вот мой процесс:
У меня есть dataTable (http://datatables.net), в котором я отображаю строки данных, используя опцию bProcessing, чтобы использовать AJAX для извлечения записей из базы данных. URL в моем urls.py выглядит примерно так:
url(r'^assets/activitylog/(?P<cid>.*)$', views.getActivityTable_ajax, name="activitylog_table"),
и мой ajax-код, относящийся к dataTable, выглядит примерно так:
"sAjaxSource": "/assets/activitylog/" + getIDFromHTML(),
где функция javascript getIDFromHTML()
захватывает <cid>
, которая используется представлением Django, просто:
function getIDFromHTML(){
// Simply return the text in the #release_id div element from the HTML
return $("#release_id").html();
};
Это та часть, которая кажется мне "счастливой". Я вставляю в код моего шаблона идентификатор базы данных, который я использую в URL datatables (с display: none в css), чтобы я мог передать его обратно в представление. Большая часть этого необходима, потому что нельзя использовать теги шаблонов django в коде javascript, если код не встроен в сам HTML, чего я не делаю (и не буду)
Единственное, что я нашел, это изменил URL, чтобы избавиться от параметра, переданного в:
url(r'^assets/activitylog', views.getActivityTable_ajax, name="activitylog_table"),
и измените код вида на:
def getActivityTable_ajax(request):
"""Returns the activity for a given pid from HTTP GET ajax reqest"""
pid = int(urlparse.urlparse(request.META['HTTP_REFERER']).path.split('/')[-1])
# rest of view code here...
, поскольку нужный мне идентификатор находится в конце URL этого реферера.
Таким образом, мне не нужно возиться с встраиванием скрытого идентификатора базы данных в HTML и передачей его через ajax код представления совокупности таблиц.
Можно ли использовать HTTP_REFERER в объекте запроса таким образом? Я поступаю об этом совершенно неправильно?
Заранее спасибо!