1

我正在将此用于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
4

2 回答 2

1

您是否尝试过子类BaseDatatableView化并覆盖其 .get ,例如:

def get(self, *args, **kwargs):
    super().get(*args, **kwargs)
    print(self.request)

我的猜测是get_initial_queryset可以在实际请求调度之前调用它,因此用户在那里是匿名的。当您查看 的代码时django_datatables/mixins.py,有一个名为JsonResponseMixin. 它的 GET 方法直接负责请求处理,所以你应该在那里寻找你的答案。最简单的方法 - 对其进行子类化并覆盖该方法。

于 2016-03-10T09:26:18.790 回答
0

您是否将令牌 JS 添加到 Datatables 启动 JS 文件中?django-datatables 只是创建正确的 JSON 字符串。启动 cookie 是不同的。

我为此奋斗了一段时间,但我缺少的部分是我必须获取并设置 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);
        }
    }
});

这是上面我设置数据表参数的地方,例如:

let table = $('#datatables').DataTable({
    "processing": true,
    "serverSide": true,
     stateSave: true,
    "ajax": {

...........

于 2018-11-14T16:36:32.910 回答