首页 > 编程问答 >从服务器获取数据后更新 DataTable 的列

从服务器获取数据后更新 DataTable 的列

时间:2024-07-31 08:51:46浏览次数:15  
标签:javascript python django ajax datatables

我需要一个解决方案来解决我的问题。我有一个 Django 应用程序,我在服务器端处理中使用 DataTables,表模板对于我拥有的所有模型都是动态的,我只需传递 (带有 data ,|| 的字典列表|和 name )在模板的上下文中,非常简单... title 之后,我需要对列进行一些更改,但根据收到的数据,这意味着我应该能够更新我的列获得数据后在 DataTable 定义中。为了使想法更清晰,以下代码代表我尝试过的尝试之一,使用

def my_page_view(request):
    columns = generate_datatables_columns("MyModel")

    return render(
        request,
        "my_page.html",
        {"columns": columns}
    )
<script>
    $(document).ready(function() {
        var columns = [];
        {% for col in columns %}
            var jsObject = {
                {% for key, value in col.items %}
                    "{{ key }}": "{{ value }}",
                {% endfor %}
            };
            columns.push(jsObject);
        {% endfor %}

        var table = $('#my-table').DataTable({
            "processing": true,
            "serverSide": true,
            "ajax": {
                "url": "/my/url",
                "type": "GET",
            },
            "columns": columns,
        });
    });
</script>

<table id="my-table" class="display" width="100%">
    <thead>
        <tr>
            {% for column in columns %}
                <th id="dt_col_{{column.data}}">{{ column.name }}</th>
            {% endfor %}
        </tr>
    </thead>
</table>

prop: ajax.dataSrc 使用此方法我找不到更新列的方法,我还尝试了其他方法,例如使用|| |,或自定义 ajax 函数,但我总是陷入死胡同。

var table = $('#my-table').DataTable({
    "processing": true,
    "serverSide": true,
    "ajax": {
        "url": "/my/url",
        "type": "GET",
        "dataSrc": function (json) {
            var data = json.data;
            var newColumns = columns;

            // make changes on data and newColumns variables with some conditions...
            
            // here should update the datatable columns with the value of newColumns.

            return data;
        }
    },
    "columns": columns,
});

如果有人帮助我,我将非常感激。 drawCallback , or custom ajax function, but I always end up with a dead-end.

I will be really grateful if someone helped me with that.


可以使用 DataTables 的 columnDefs 选项和 JavaScript 函数来实现此目的,该函数允许在呈现列时根据从服务器收到的数据动态地修改列。

以下是更新后的代码:

JavaScript:

$(document).ready(function() {
  var columns = [];
  {% for col in columns %}
    var jsObject = {
      {% for key, value in col.items %}
        "{{ key }}": "{{ value }}",
      {% endfor %}
    };
    columns.push(jsObject);
  {% endfor %}

  var table = $('#my-table').DataTable({
    "processing": true,
    "serverSide": true,
    "ajax": {
      "url": "/my/url",
      "type": "GET",
    },
    "columns": columns,
    "columnDefs": [
      {
        // 遍历所有列
        "targets": "_all",
        "createdCell": function (td, cellData, rowData, row, col) {
          // 在这里,可以访问:
          // - td: 当前单元格的 DOM 元素
          // - cellData: 当前单元格的数据
          // - rowData: 当前行的所有数据
          // - row: 当前行的索引
          // - col: 当前列的索引

          // 根据 rowData 或 cellData 更新列定义
          // 例如,如果 rowData.status === 'inactive',则将列设为不可见
          if (rowData.status === 'inactive' && col === 2) {
            $(td).parent().addClass('hidden');
          }
        }
      }
    ]
  });
});

解释:

  1. columnDefs : 此选项允许定义应用于特定列或所有列的规则。
  2. targets : "_all" 表示此规则将应用于所有列。
  3. createdCell : 此回调函数在创建每个单元格时都会被调用。它提供了对单元格数据、行数据和列索引的访问。
  4. 更新逻辑: createdCell 函数内部,可以编写逻辑来根据从服务器收到的数据 ( rowData cellData ) 更新列定义。例如,可以根据某些条件更改列的可见性、类名或数据。

优点:

  • 动态更新: 允许在渲染表时根据服务器响应动态更新列定义。
  • 灵活性: 可以使用 JavaScript 函数实现复杂的更新逻辑。
  • 性能: 与使用 ajax.dataSrc 相比,此方法通常性能更好,因为它不会操作底层数据源。

注意:

  • 确保更新逻辑仅修改与 DataTables 相关的属性(如可见性、类名等)。不要直接修改单元格内容,因为这可能会导致意外行为。
  • 此方法仅在创建单元格时有效。如果需要根据后续服务器请求更新列,则需要使用 DataTables API 更新列定义并刷新表。

我希望这可以帮助解决问题!如果有任何其他问题,请告诉我。

标签:javascript,python,django,ajax,datatables
From: 78813702

相关文章

  • 具有自引用的类装饰器的 Python 类型提示
    我的最终目标是编写一个系统来轻松记录函数调用(特别是类方法)。我首先编写一个带有包装方法的类Loggable,该方法允许我装饰子类方法并记录它们的调用|||现在我可以编写子类并记录它们的调用:Param=ParamSpec("Param")RetType=TypeVar("RetType")CountType=......
  • 如何在for循环中使用curve_fit函数在python中一次性创建多个回归?
    简而言之,我有两个矩阵,一个称为t,另一个称为y。每个都有7列。假设它们被称为a、b、c、d、e、f和g。我想要的是从a对a、b对b、...、g对g这两个矩阵进行回归。我已经设法使我的算法使用curve_fit对一列进行回归一次。但我真正希望的是它能够一次性完成7个回归......
  • 激活虚拟环境会让python消失?
    VisualStudioCode终端的屏幕截图如屏幕截图所示,python在Powershell中运行得很好。然后我在E:\DrewFTCAPI\ftcapivenv激活虚拟环境,然后python就消失了。不仅没有消失,它不运行任何东西,也不产生任何输出。我至少预计会出现某种类型的"python"i......
  • Python 3.6 中的相互递归类型,使用命名元组语法
    我正在尝试实现图的节点和边。这是我的代码:fromtypingimportNamedTuple,ListclassNode(NamedTuple):name:stredges:List[Edge]classEdge(NamedTuple):src:Nodedest:Node这会引发错误,因为创建Edge时未定义Node类型。......
  • 使用 keras 模型对函数进行 Python 类型提示
    如果我创建这样的函数:defmdl(input_shape):model=Sequential()model.add(Conv2D(depth=64,kernel_size=(3,3),input_shape=input_shape,activation='relu'))model.add(Dense(32),activation='relu')model.add(Dropout(0.3))m......
  • Python:自动完成可以用于列表中的元素吗?
    Python在函数参数和函数返回类型中具有类型提示。类的元素是否有类似的东西?我希望能够在如下示例中使用自动完成功能:classMyClass:defhello(self):print("Hello")mylist=[]mylist.append(MyClass())foriinmylist:i.hello()#Noautocomplete......
  • python 中 COM 对象的正确类型提示是什么?
    我在python中使用COM对象来向3rd方软件公开可编程接口。这是通过使用Dispatchfromwin32com.client来实现的。我的项目也一直在使用python.3.7中的类型提示,但是我不确定如何为了类型提示的目的定义这些COM对象的类型。这个问题涉及我拥有的所有COM......
  • 如何遍历Python字典同时避免KeyErrors?
    解析大型JSON时,某些键可能仅在某些情况下存在,例如出现错误时。从服务器的API获取200OK的情况并不少见,但是您得到的响应包含应检查的错误。处理此问题的最佳方法是什么?我知道使用类似||之类的东西。|是处理KeyError的一种方法。get()但是如果......
  • Python 中的递归数据类型
    Python中最接近Haskell中的递归数据类型的是什么?(即在定义自身时使用类型自己的定义。)编辑:为了给出递归类型的更具体定义,下面是Haskell中的二叉树:dataTreea=Leafa|Branch(Treea)(Treea)我的阅读方式如下:二叉树可以是叶子,也可以包含两......
  • 如何在Python中平滑相邻的多边形?
    我正在寻找一种平滑多边形的方法,以便相邻/接触的多边形保持接触。单个多边形可以轻松平滑,例如使用PAEK或Bezier插值(https://pro.arcgis.com/en/pro-app/latest/tool-reference/cartography/smooth-polygon.htm),这自然会改变它们的边界边缘。但是如何平滑所有多边形......