【问题标题】:Django: Get a table into Django viewDjango:在 Django 视图中获取一个表
【发布时间】:2019-10-26 12:04:10
【问题描述】:

我有 Django 模型,其中包含 10 个人的数据(“姓名”和“状态”)。我在带有复选框的DataTable 中显示此模型,如果我选中一个框,它会将类更改为selected,例如<tr role="row" class="odd selected"

用户从DataTable 中进行选择并按下按钮(“通过电子邮件发送选择”)。选择将进入 Django 视图。我将编写代码过滤掉那些包含 selected 的代码,获取它的 PK 并发送一封包含信息的电子邮件。

但是,我在第一步中遇到问题,将DataTable 对象放入视图中。

类似的方法是使用Multiselect,但在这里我想要表格而不是表单框的外观。

我尝试的解决方案是在DataTable 周围放置表单标签,然后读取表格以过滤掉所有selected

我目前遇到的问题是我无法将DataTable 放入views.py

所以我的问题是:如何访问 Django View 中的表格?

我在下面尝试了POSTGET,但请求对象返回为None

$('#datatable').DataTable({
  responsive: true,
  columnDefs: [{
    orderable: false,
    className: 'select-checkbox',
    targets: 0
  }],
  select: {
    style: 'multi',
    selector: 'td:first-child',
    // selectRow: true
  },
  order: [
    [1, 'asc']
  ],

  language: {
    searchPlaceholder: 'Search...',
    sSearch: '',
    lengthMenu: '_MENU_ items/page',
  }
});
<!DOCTYPE html>
<html lang="en">

<head>
  <title>Bootstrap Example</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>
  <script src="https://cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js"></script>
  <script src="https://cdn.datatables.net/select/1.3.1/js/dataTables.select.min.js"></script>
</head>

<body>

  <div class="container">

    <form method="post" action="{% url 'product-send2' %}">
      {% csrf_token %}

      <div class="table-wrapper">
        <table class="form-control table display responsive" id='datatable' style="width:100%;">

          <thead>
            <tr>
              <th>Send</th>
              <th>Name</th>
              <th>Status</th>
            </tr>
          </thead>

          <tbody>
            {% for object in object_list %}
            <tr>
              <td></td>
              <td>{{ object.name }}</td>
              <td>{{ object.status }}</td>
              <tr>
                {% endfor %}

          </tbody>

          <tfoot>
          </tfoot>
        </table>
      </div>
      <button type="submit" class="btn btn-primary">Submit</button>
    </form>

  </div>

</body>

</html>

在网址中

path('product/send/', send_product2, name='product-send2')

在视图中

def send_product2(request):
    recipients = request.POST.get('datatable')
    print(recipients)
    return HttpResponseRedirect('/product/list')

我尝试过诸如

之类的变体
recipients = request.GET.get('datatable')

recipients = request.POST.get('datatable', False)

我无法获得"object",也不知道如何调试它。

最后,它应该作为表单的多选(将通过电子邮件发送)。

我希望我能帮助一些提示如何进步。

谢谢!

当我print(request.__dict__) 时,它看起来像下面

: <SimpleLazyObject: <function AuthenticationMiddleware.process_request.<locals>.<lambda> at 0x7f907ab5f680>>, '_messages': <django.contrib.messages.storage.fallback.FallbackStorage object at 0x7f907ab82b10>, '_body': b'csrfmiddlewaretoken=xxx_length=10', '_post': <QueryDict: {'csrfmiddlewaretoken': ['xxxxx'], 'datatable_length': ['10']}>, '_files': <MultiValueDict: {}>, 'csrf_processing_done': True}

【问题讨论】:

  • 不清楚您在这里要做什么。表格的数据来自哪里?
  • 你想把数据表放到 Django 中,还是放到模板中?
  • 抱歉,不清楚,我已经更新了问题并澄清了
  • 但这仍然不清楚。您在该模板中没有任何复选框。
  • sry,为了不造成信息过载而试图经济,但显然会造成混乱。

标签: python django datatables


【解决方案1】:

您不能在表单中提交整个表格,尤其是基于 id 标记。从您发布的代码看来,您在没有事件处理程序的情况下配置了数据表。 来自:https://editor.datatables.net/examples/inline-editing/submitButton.html

dom: "Bfrtip",
    ajax: "../php/staff.php",
    columns: [
        {
            data: null,
            defaultContent: '',
            className: 'select-checkbox',
            orderable: false
        },
        { data: "first_name" },
        { data: "last_name" },
        { data: "position" },
        { data: "office" },
        { data: "start_date" },
        { data: "salary", render: $.fn.dataTable.render.number( ',', '.', 0, '$' ) }
    ],
    order: [ 1, 'asc' ],
    select: {
        style:    'os',
        selector: 'td:first-child'
    },
    buttons: [
        { extend: "create", editor: editor },
        { extend: "edit",   editor: editor },
        { extend: "remove", editor: editor }
    ]

然后添加了一个提交按钮,该按钮实际上尝试在表单 dom 子树中提取所有带有名称标签的元素并将它们发送到后端。 为了实现您想要的,您需要在前端创建一个与复选框挂钩的自定义事件处理程序(或使用 DataTable 插件中集成的功能),然后使用 javascript 在其中添加相关的动态生成一个表单信息(我假设所选记录的 pk)。提交新生成的表单将导致您可以在视图中处理的有效 POST 请求。

鉴于以上所有情况,我建议一般避免使用此类机制。不基于 REST 的 POST/GET 会导致整个页面的重新生成,这在处理大型交互式表格时是一件坏事。

【讨论】:

  • 谢谢,在我给出反馈之前需要一些时间来消化,但总的来说,如果你愿意(让用户在稍后将“分析”的列表中进行选择)在上面“首选方式”还是我应该花时间了解另一个解决方案?谢谢
  • 无论哪种方式,最后都取决于您的项目范围和特定情况。如果您希望在选择时重定向到不同的页面,请选择此选项,最后您将呈现一个新页面。例如,如果你想切换一个标签,渲染整个页面是一种矫枉过正的行为,它会破坏用户体验。
  • 好的,现在有时间看看,我在这里看不到解决方案。我要的是如何将选择返回到 View 中,以便使用 Python 代码进行进一步操作。理想情况下,需要在 Django 中使用应用程序提供一个小的完整答案,即通过仅根据表格中的复选框标记取一个值并将其传输回视图来显示
猜你喜欢
  • 2013-03-23
  • 2015-11-25
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 2010-12-21
  • 2019-02-08
  • 1970-01-01
  • 2013-04-19
相关资源
最近更新 更多