Django - Datatables с каркасом отдыха
Я использую эту библиотеку для datatables в django-rest. Все работает нормально, ожидаем сессию request.user в представлениях. Мне кажется, django-datatable не аутентифицирует токен пользователя и, следовательно, request.user возвращает анонимного пользователя. И то же самое доступно даже без отправки токена пользователя в заголовках.
Вот мой код:
class MyDataTableView(BaseDatatableView):
"""
"""
model = MyModel
columns = [***columns** ]
order_columns = [***columns**]
def get_initial_queryset(self):
"""
initial queryset for
"""
self.request.user -----> returns antonymous user
queryset = self.model.objects
return queryset
2 ответа
Вы пытались подкласс BaseDatatableView
и перезаписать его.get, как:
def get(self, *args, **kwargs):
super().get(*args, **kwargs)
print(self.request)
Я думаю, что get_initial_queryset
может быть вызван до фактической отправки запроса, поэтому пользователь там анонимен. Когда вы смотрите в код django_datatables/mixins.py
есть миксин под названием JsonResponseMixin
, Именно метод GET непосредственно отвечает за обработку запроса, поэтому вы должны искать там свои ответы. Самый простой способ - создать подкласс и переписать метод.
Вы добавили токен JS в файл JS инициации Datatables? django-datatables просто создает правильную строку JSON. Инициирование cookie отличается.
Я боролся с этим некоторое время, и моя недостающая часть была то, что я должен был получить и установить печенье:
// using jQuery
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie !== '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
var csrftoken = getCookie('csrftoken');
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
}
});
это выше, где я установил параметры Datatables, например:
let table = $('#datatables').DataTable({
"processing": true,
"serverSide": true,
stateSave: true,
"ajax": {
........