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": {

........

Другие вопросы по тегам