Есть ли что-то, что я пропустил при настройке django -rest-framework-datatables, получая ошибку «Предупреждение DataTables: идентификатор таблицы = тест - Ajax ошибка» - PullRequest
0 голосов
/ 09 апреля 2020

Я пытался настроить таблицы данных с работой остальных кадров, я получаю сообщение об ошибке, когда страница загружает все поля данных, такие как нумерация страниц, поиск и заголовок, но данные не отображаются. в чем может быть причина?

serializers.py

class PermissionSerializer(serializers.ModelSerializer):
class Meta:
    model = Permission
    fields = (
        'name', 'code', 'app',
    )

views.py

from rest_framework import viewsets
from .serializers import PermissionSerializer

class PermissionViewSet(viewsets.ModelViewSet):
    queryset = Permission.objects.all()
    serializer_class = PermissionSerializer


class ViewallPerms(View):
    def get(self, request):
        context = {
            'a' : 'a',
        }
        return render(request, 'flamika_admin/view_allpermissions.html', context)

urls.py

 url(r'^perms/$', views.PermissionViewSet, name='perms'),
 path('all-perms', login_required(views.ViewallPerms.as_view(), login_url='f_admin:admin_login'), name='all-perm'),

view_allpermissions. html

<script src="https://code.jquery.com/jquery-1.8.0.min.js"></script>

<div class="row">
    <div class="col-sm-12 col-xs-12">
        <table id="test" class="table table-striped table-bordered" style="width:100%">
        <thead>
            <tr>
                <th>Code</th>
                <th>Name</th>
                <th>App</th>
            </tr>
        </thead>

    </table>
</div>
</div>
<script>
    $(document).ready(function() {
        var table = $('#test').DataTable({
            "serverSide": true,
            dataSrc: "",
            "ajax": "{% url 'flamika_admin:perms' %}",
            "columns": [
                {"data": "name"},
                // Use dot notation to reference nested serializers.
                // This data: could alternatively be displayed with the serializer's ReadOnlyField as well, as seen in the minimal example.
                {"data": "code"},
                {"data": "app"},
           ]
        });
        $('.btn-decade').on('click', function() {
            table.columns().search('');
            var rel = $(this).attr('rel');
            if (rel) {
                table.columns(3).search('^' + rel + '[0-9]$', true).draw();
            } else {
                table.draw();
            }
        });
        $('#albums_minimal').DataTable({
           "search": {"regex": true},
           "language": {"searchPlaceholder": "regular expression"}
        });
    });
    </script>

пожалуйста, дайте мне знать, где я ошибся, это правильный способ настроить серверную часть с таблицами данных. Пожалуйста, поправьте меня. Я хотел отобразить все данные в этой модели.

1 Ответ

1 голос
/ 09 апреля 2020

Вы забыли добавить "?format=datatables" в свой ajax вызов API. Таблицы данных ожидают, что ответ определенным образом будет отображаться правильно, и, если вы правильно настроили django-rest-framework-datatables (следуйте документам, это довольно просто), библиотека проверяет, установлен ли для параметра format набор данных или нет. Если он не задан, используется формат разбиения на страницы по умолчанию в DRF (который не работает с таблицами данных, в вашем случае), где, если установлено, то django-rest-framework-datatables форматирует ответ правильным способом для таблиц данных.

Примечание: Поэтому я хотел бы упомянуть, если вы хотите использовать обратную функцию django даже в файле js, есть хорошая библиотека, на которую я буду ссылаться https://github.com/ierror/django-js-reverse.

Используйте это, чтобы повернуть вспять и добавить ?format=datatables к URL, или вы можете написать URL вручную. Например,

"ajax": {
        "url": "http://127.0.0.1:8000/perms/?format=datatables",
        "type": "GET",
        "headers": {
                /* any headers */
       },
       "dataSrc": "Mention your data source from the respone "
}

Проверьте там URL, убедитесь, что он прав. Я только что написал это в качестве примера.

Обновление: URL-маршрутизация для PermissionViewSet была неправильной. Правильная форма:

url(r'^perms/$', PermissionViewSet.as_view({"get": "list"}), name="perms")

Обратите внимание на отображение метода запроса.

...