0

我正在使用一个模板来显示一个包含多行的表格。2000但是在此实现 django 分页会使它变得太慢,因为数据太多。什么是最好的方法来解决这个问题。或者我怎样才能使分页加载每页 200 行,使页面更快。我怎样才能使页面加载更快

   {% extends "base/admin_base.html" %}
   {% load pagination_tags %}




         {% autopaginate response_dict.taggeddata 100 %}
           <div align="right">{% paginate %}</div>
  <form action="/users/saveuser/" method="post">{% csrf_token %}
  <b>
        <table>

         <tr><td><font>*</font>Select Category group for tagging</td><td> 
         <select id="cgroup" onchange="getcategory('1');">
         <!--<option value="-1">Select Category group</option>   -->
         {% for group in response_dict.categorygroup %}
                  <option value="{{group.id}}">{{group.name}}</option> 
         {% endfor %}
         </select>  
         </td></tr>

        </table>
        </b>
        <table  id="box-table-a">
        <colgroup>
        <col class="vzebra-odd">
        <col class="vzebra-even">
        <col class="vzebra-odd">
        <col class="vzebra-even">
        <col class="vzebra-odd">
        <col class="vzebra-even">
        <col class="vzebra-odd">
        <col class="vzebra-even">
        </colgroup>
        <thead>
         <tr><th id="vzebra-comedy" scope="col">Field1</th><th id="vzebra-adventure" scope="col">Field2</th><th id="vzebra-comedy" scope="col">Field3</th><th id="vzebra-adventure" scope="col">Field4</th><th id="vzebra-comedy" scope="col">Field5</th><th id="vzebra-adventure" scope="col">Field6</th><th id="vzebra-comedy" scope="col">Tag</th><th id="vzebra-adventure" scope="col">Actions</th><thead></tr>
        <tbody>  
         {% for td in response_dict.taggeddata %}
           <tr id="{{td.id}}">
           <td width="20%">{{td.field1}}</td>
           <td>{{td.field2}}</td>
           <td>{{td.field3}}</td>
           <td>{{td.field4}}</td>
           <td>{{td.field5}}</td>
           <td>{{td.field6}}</td>
           <td class="tg">Select category</td>
           <td ><img src="/media/img/cancel.png" alt="delete" height="20" width="20" onclick="delete_row('{{td.id}}')"></td>
           </tr>
         {% endfor %}
        </tbody>
        </table>
         <input type="button" value="Add" id="addbtn" onclick="validate();"/>

  </form>
4

2 回答 2

0

使用基于类的视图, paginate_by :参见 django.views.generic.list.BaseListView 。此外,如果性能很重要,请使用 ajax 并使用 json 将数据传递到前端。另外我建议您使用 Model.objects.values_list()

像这样的东西:

class MovieLandingJSON(JSONResponseMixin, BaseListView):
    """
    Movie landing page movie covers in json format.
    """
    paginate_by = 5
    context_object_name = 'movies'
    queryset = Movie.objects.all()
    values_list = ['id', 'title', 'slug']

    def get_queryset(self):
    """
    Filters  queryset on request
    """
        queryset = super(MovieLandingJSON, self).get_queryset()

        if self.values_list:
            queryset = queryset.values_list(*self.values_list)
        return queryset


from django.core.serializers import serialize
from django.utils.simplejson import dumps, loads, JSONEncoder
from django.db.models.query import QuerySet
from django.utils.functional import curry


class DjangoJSONEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, QuerySet):
            # `default` must return a python serializable
            # structure, the easiest way is to load the JSON
            # string produced by `serialize` and return it
            return loads(serialize('json', obj))
        return JSONEncoder.default(self,obj)

dumps = curry(dumps, cls=DjangoJSONEncoder)


class JSONResponseMixin(object):
    """
    A mixin that can be used to render a JSON response.
    """
    response_class = HttpResponse

    def render_to_response(self, context, **response_kwargs):
        """
        Returns a JSON response, transforming QuerySet to json.
        """
        response_kwargs['content_type'] = 'application/json'
        return self.response_class(
            self.convert_queryset_to_json(context['object_list']),
            **response_kwargs
        )

    def convert_queryset_to_json(self, queryset):
        if self.values_list:
            return simplejson.dumps(list(queryset))
        else:
            return dumps(queryset)
于 2012-08-07T13:32:02.327 回答
-1

我在 Django 中使用多达 400 万个数据集的分页。工作没有任何性能问题...

于 2012-08-07T15:05:28.790 回答