【问题标题】:Django Edit Or Delete Selected Rows In A Table - ListViewDjango 编辑或删除表中的选定行 - ListView
【发布时间】:2021-02-13 19:33:54
【问题描述】:

我有一个带有复选框的表格,我希望能够删除或编辑表格中所有选定行的特定字段值。

这是一个可以重新创建的示例表,但我在任何地方都没有找到如何在视图和模板中工作的示例。 https://examples.bootstrap-table.com/#

我当前的视图,它正在处理一个表格。我可以从哪里开始从基本表格飞跃到上面示例中的交互式表格?

Views.py

class EntryList(LoginRequiredMixin, ListView):
    context_object_name = 'entry_list'
    paginate_by =  100
    # paginate_by =  5
    #ordering = ['-pk']
    model = Entry
    template_name = "portfolios/entry_list.html"

    def get_queryset(self):
        return Entry.objects.filter(created_by=self.request.user).order_by('-pk')

    def post(self, request, *args, **kwargs):
        ids = self.request.POST.get('ids', "")
        # ids if string like "1,2,3,4"
        ids = ids.split(",")
        try:
            # Check ids are valid numbers
            ids = map(int, ids)
        except ValueError as e:
            return JsonResponse(status=400)
        # delete items
        self.model.objects.filter(id__in=ids).delete()
        return JsonResponse({"status": "ok"}, status=204)

entry_list.html

{% extends "dashboard/base.html" %}
{% load i18n %}
{% block content %}

<!-- Page Heading -->
<div class="d-sm-flex align-items-center justify-content-between mb-4">
    <h2 class="text-gray-800">{% block title %}{% trans "Imported Entries" %}{% endblock %}</h2>
    <a role="button" class="btn btn-success" href="{% url 'import' %}"><i
            class="fas fa-plus-circle"></i> Import New Entires</a>
</div>

<!-- Content Row -->
<div class="row">

    <div class="col-md-12">
        <div class="card shadow mb-4">
            <div class="card-body">
                <div id="dataTable_wrapper" class="dataTables_wrapper dt-bootstrap4">
                    <div class="row">
                    </div>
                    <div class="row">
                        <div class="col-sm-12">
                            <table class="table-responsive-xl table table-hover table-striped table-bordered dataTable" id="dataTable" width="100%"
                                   cellspacing="0" role="grid" aria-describedby="dataTable_info">
                                <thead>
                                <tr role="row">
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">
                                    </th>
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">ID
                                    </th>
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">Date
                                    </th>
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">Trade
                                    </th>
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">Type
                                    </th>
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">Symbol
                                    </th>
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">Amount
                                    </th>
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">Price
                                    </th>
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">Fee
                                    </th>
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">Reg Fee
                                    </th>
                                    <th class="sorting" tabindex="0" aria-controls="dataTable" rowspan="1"
                                        colspan="1" aria-label="" style="">Ref
                                    </th>
                                </tr>
                                </thead>
                                <tbody>
                                {% for entry in object_list %}
                                <tr role="row">
                                    <td class="text-center">
                                        <div class="custom-control-lg custom-control custom-checkbox">
                                            <input type="checkbox" class="custom-control-input form-control-lg" data-id="{{ entry.pk}}" id="check{{ entry.pk }}">
                                            <label class="custom-control-label" for="check{{ entry.pk }}"></label>
                                        </div>
                                    </td>
                                    <td><a href="{% url 'entry-update' entry.pk %}">{{ entry.pk }}</a></td>
                                    <td>{{ entry.date | date:"M d, Y h:i:s A"}}</td>
                                    <td><a href="/trade/{{ entry.trade.id }}">{{ entry.trade.id }}</a></td>
                                    <td>{{ entry.entry_type }}</td>
                                    <td>{{ entry.symbol }}</td>
                                    <td>{{ entry.amount }}</td>
                                    <td>{{ entry.price }}</td>
                                    <td>{{ entry.fee }}</td>
                                    <td>{{ entry.reg_fee }}</td>
                                    <td>{{ entry.transaction_id }}</td>
                                </tr>
                                {% endfor %}

                                </tbody>
                            </table>
                        </div>
                    </div>
                    <!--Pagination-->
                    <div class="row">
                        <div class="col-12 ">


                            <div class="pagination">
                                <span class="step-links">
                                    {% if page_obj.has_previous %}
                                        <a href="?page=1">&laquo; first</a>
                                        <a href="?page={{ page_obj.previous_page_number }}">previous</a>
                                    {% endif %}

                                    <span class="current">
                                        Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
                                    </span>

                                    {% if page_obj.has_next %}
                                        <a href="?page={{ page_obj.next_page_number }}">next</a>
                                        <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
                                    {% endif %}
                                </span>
                            </div>


                        </div>
                    </div>
                </div>
            </div>
        </div>

    </div>

</div>
{% endblock content %}

【问题讨论】:

    标签: django listview django-rest-framework


    【解决方案1】:

    这取决于你如何实现你的前端,但假设你有标准的 django 模板,那么我建议你看看datatables。它有很多内容,但它非常稳定并且具有不错的功能集,并且文档很好。你可以使用bootstrap来设置你想要的样式。

    此外,您链接到引导表 - 这应该是相同的原则。通读文档以了解其工作原理,您将不得不使用 Django 模板标签来呈现表格中的数据。

    请注意,该表是使用 HTML / Jquery 实现的,因此它与 Django 没有直接关系。您需要做的就是遍历模板中的 django 对象 (example)

    编辑

    如何删除选中的行?

    假设您可以选择 N 行,然后单击一个按钮来删除所有这些行。

    这可以如下工作:

    • 向删除按钮添加处理程序:
    • 识别选定的行
    • 发送 Ajax 请求以删除行
    • 处理成功响应以从表中删除已删除的行
    // SIMPLIFIED CODE SAMPLE
    
    $("#delete-btn").click(function () {
      var selectedRows = table.rows({"selected": true});
    
      var dataObj = {
        // parse selectedRows to get object ids
      }
      
      $.ajax({
          url: '/api/delete-rows/',
          type: 'post',
          data: dataObj,
          success: function (data, status, xhr) {
            // remove the selected rows from the view
            table.rows({"selected": true}).deselect().remove().draw();
          }
        })
    }
    

    如何选择行并快速更改所有选定行的字段?

    这里的原理相同。选择行后,有一个处理程序来识别所选行,然后您可以使用数据表 api 更新给定字段 (docs)。

    【讨论】:

    • 我的表工作正常,它在引导程序中,并且已经有一个复选框 col。我的问题是让桌子有动作。如何删除选定的行?如何选择行并快速更改所有选定行的字段?
    • 感谢更新的答案仍在处理中!如果我有任何问题,我会在这里更新,但就目前而言,这看起来是 100% 正确的方向。我将不得不考虑数据表或模板标签方法最适合我的情况。如果您对哪个是理想的有任何反馈,我总是愿意接受反馈。
    • 请注意,您可以同时使用模板标签和数据表 - 数据表只是一个库,可帮助处理呈现表的大部分方面。让数据表工作可能很棘手,但有不错的文档和专门的论坛,所以值得花时间投资 IMO
    • 我似乎无法让数据表正常工作。我不确定问题出在哪里,这是我目前卡在stackoverflow.com/questions/64692777/…
    • 使用引导主题我将“已选择”更改为“活动”,但仍未突出显示正确的行。任何想法? datatables.net/forums/discussion/65425/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 2012-04-14
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 2021-04-08
    • 2015-04-10
    相关资源
    最近更新 更多