Django: получить таблицу в представлении Django - PullRequest
0 голосов
/ 26 октября 2019

У меня есть модель Django, которая содержит данные («Имя» и «Статус») для 10 человек. Я отображаю эту модель в DataTable с флажками, и если я устанавливаю флажок, она меняет класс на selected, например, <tr role="row" class="odd selected"

. Пользователь делает выбор из DataTable и нажимает кнопку. («Отправить выбор по электронной почте»). Выбор перейдет в Django View. Я напишу код, который отфильтровывает те, которые содержат selected, получит его PK и отправит электронное письмо с информацией.

Однако на первом шаге у меня возникла проблема с получением объекта DataTableв вид.

Аналогичным подходом было бы использование Multiselect, но здесь я хочу видеть таблицу, а не окно формы.

Мое попытанное решениеэто поставить теги формы вокруг DataTable, а затем прочитать таблицу, чтобы отфильтровать все, что является selected.

Проблема, с которой я столкнулся в настоящее время, заключается в том, что я не могу вставить DataTable в views.py.

Итак, мой вопрос: как мне получить доступ к таблице в Django View?

Я пробовал оба POST и GET ниже, но объект запроса возвращается как 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>

В URL

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}

1 Ответ

0 голосов
/ 26 октября 2019

вы не можете отправить всю таблицу в форме, особенно на основе тега id. Из кода, который вы опубликовали, похоже, что вы сконфигурировали свою таблицу данных без обработчиков событий. From: 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 }
    ]

, а затем добавили кнопку отправки, которая на самом деле пытается вытянуть все элементы с тегом name в поддереве dom формы и отправить их на сервер. Чтобы достичь желаемого, вам нужно создать пользовательский обработчик событий во внешнем интерфейсе, который будет привязан к флажку (или использовать функции, встроенные в плагин DataTable), а затем сгенерировать форму на лету с javascript, куда вы добавите соответствующийинформация (пк выбранной записи / с я предполагаю). Отправка вновь созданной формы приведет к действительному запросу POST, который вы можете обработать в представлении.

Учитывая все вышесказанное, я бы рекомендовал вообще избегать использования такой механики. POST / GET, основанные не на REST, приводят к регенерации всей страницы, что является плохой вещью при работе с большими интерактивными таблицами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...