Python django admin中内联模型的分页器

Python django admin中内联模型的分页器,python,django,django-admin,Python,Django,Django Admin,我有一个简单的django模型,由一个传感器和特定传感器的值组成。 每个日射强度计的数值较高(>30k)。是否有可能在特定日期对日射强度计值进行分页,或者将分页器应用于管理内联视图 class Pyranometer(models.Model): name = models.CharField(max_length=75) clas

我有一个简单的django模型,由一个传感器和特定传感器的值组成。 每个日射强度计的数值较高(>30k)。是否有可能在特定日期对日射强度计值进行分页,或者将分页器应用于管理内联视图

class Pyranometer(models.Model):
     name = models.CharField(max_length=75)                                                                             

class PyranometerValues(models.Model):                                                                                 
    timestamp = models.DateTimeField()
    value = models.DecimalField(max_digits=10,decimal_places=6)                                                        
    sensor = models.ForeignKey('Pyranometer')      

你检查过属性了吗?我想您可能会发现它很有用。

因为django admin主要是一个模板问题(只需要将模板重新定义为i18n一些django admin工具部分),我有一个想法

这些是Django的分页模块,如linaro Django分页或无止境分页,它们提供了模板标记,可以对任何可分页的内容进行分页

如果可以找到负责显示内联模型的模板,可以将其复制到项目中,然后尝试向其添加{%load pagination_tags%}并对内联线进行分页


我没有对它进行测试,也没有对它进行透彻的思考,但除了验证之外,我不认为它会失败。请测试并告诉我们。

好吧,动态生成的过滤器可能会有帮助:

此外,管理员还有一个很好的GET类型查询,如中所示:

localhost:8000/admin/pyranometervalues/?value=10.0

您可以将日期指定为:

admin/pyranometervalues/?timestamp\u year=2011×tamp\u month=10×tamp\u day=13

等等。。。不幸的是,我不知道在admin中进行此查询的较短方法。有什么想法吗?:)


编辑:这仅用于缩小查询范围,与分页无关;)

如果有人需要这个,我发现这个分页
tablarinline
子类的实现很好(尽管被描述为“非常粗糙”)

对于Django 1.6,它需要更改模板并对该
paginationLine
类进行子类化:

from django.contrib import admin
from django.contrib.admin.views.main import ChangeList
from django.core.paginator import EmptyPage, InvalidPage, Paginator

class InlineChangeList(object):
    can_show_all = True
    multi_page = True
    get_query_string = ChangeList.__dict__['get_query_string']

    def __init__(self, request, page_num, paginator):
        self.show_all = 'all' in request.GET
        self.page_num = page_num
        self.paginator = paginator
        self.result_count = paginator.count
        self.params = dict(request.GET.items())


class PaginationInline(admin.TabularInline):
    template = 'admin/edit_inline/tabular_paginated.html'
    per_page = 20

    def get_formset(self, request, obj=None, **kwargs):
        formset_class = super(PaginationInline, self).get_formset(
            request, obj, **kwargs)
        class PaginationFormSet(formset_class):
            def __init__(self, *args, **kwargs):
                super(PaginationFormSet, self).__init__(*args, **kwargs)

                qs = self.queryset
                paginator = Paginator(qs, self.per_page)
                try:
                    page_num = int(request.GET.get('p', '0'))
                except ValueError:
                    page_num = 0

                try:
                    page = paginator.page(page_num + 1)
                except (EmptyPage, InvalidPage):
                    page = paginator.page(paginator.num_pages)

                self.cl = InlineChangeList(request, page_num, paginator)
                self.paginator = paginator

                if self.cl.show_all:
                    self._queryset = qs
                else:
                    self._queryset = page.object_list

        PaginationFormSet.per_page = self.per_page
        return PaginationFormSet

对于Django的任何版本,请执行以下步骤:

  • 访问此文件:
    python3.7/site packages/django/contrib/admin/templates/admin/edit\u inline/tabular.html
    在您的
    app/templates/admin/edit\u inline/anyname.html
  • 标记外接程序anyname.html之间:

       <style>
        .dark {
          /*background-color: #417690;*/
          background-color: #FFFFFF;
          border: none;
          color: #666;
          padding: 5px 10px;
          text-align: center;
          text-decoration: none;
          display: inline-block;
          font-size: 12px;
          margin: 4px 2px;
          cursor: pointer;
        }
        .light {
          background-color: #008CBA;
          border: none;
          color: white;
          padding: 5px 10px;
          text-align: center;
          text-decoration: none;
          display: inline-block;
          font-size: 12px;
          margin: 4px 2px;
          cursor: pointer;
        }
    
      </style>
       <div>
       {% with inline_admin_formset.formset.page as page_obj %}
        <p class="paginator">
          {% if page_obj.previous_page_number > 1 %}
            <a href="?page={{ page_obj.previous_page_number|add:'-1' }}">{% trans 'previous' %}</a>
          {% endif %}
    
          {% if page_obj.number|add:"-5" > 0 %}
            <a href="?page=0">1</a>
          {% endif %}
    
          {% if page_obj.number|add:"-5" > 1 %}
            <span>&hellip;</span>
          {% endif %}
    
          {% for page_num in page_obj.paginator.page_range %}
            {% if page_obj.number == page_num %}
              <span class="dark">{{ page_num|add:"-1" }}</span>
            {% else %}
              {% if page_num > page_obj.number|add:"-5" and page_num < page_obj.number|add:"5" %}
                <a class="light" style="color:white" href="?page={{ page_num|add:'-1' }}">{{ page_num|add:"-1" }}</a>
              {% endif %}
            {% endif %}
          {% endfor %}
    
          {% if page_obj.number|add:"5" < page_obj.paginator.num_pages %}
            <span>&hellip;</span>
          {% endif %}
    
          {% if page_obj.number|add:"4" < page_obj.paginator.num_pages %}
            <a href="?page={{ page_obj.paginator.num_pages }}">{{ page_obj.paginator.num_pages }}</a>
          {% endif %}
    
          {% if page_obj.next_page_number < page_obj.paginator.num_pages|add:'1' %}
            <a href="?page={{ page_obj.next_page_number|add:'-1' }}">{% trans 'next' %}</a>
          {% endif %}
          <span class='dark'>{{ page_obj.paginator.count }} Queries</span>
        </p>
      {% endwith %}
      </div> 
    

    这就是你要找的吗?[django admin分页问题][1][1]:@user856070不。我的问题是关于内联视图和分页的。不幸的是,似乎没有办法按照默认设置为内联视图对对象进行分页听起来您的传感器页面不是用于编辑传感器值的。如果是这样的话,我一开始就不会使用内联线。最好覆盖
    change_form.html
    并使用自定义模板标记在那里呈现分页传感器值列表。将
    app_label
    object_id
    传递到模板标签以查找传感器实例。请参阅@akaihola上的“覆盖管理模板”。如果不编辑数据,只需将其作为列表输出。使用自定义列表模板的缺点是它不干燥。我刚刚复制了InlineAdminModel模板中的所有自定义字段格式,因为a)Django admin内联模型还没有分页,b)显然可以为内联模型设置的
    max_num
    值(以及
    extra
    can_delete
    等字段)似乎不起作用。(Django版本1.4)。不幸的是,raw_id_字段有所不同。我将raw_id_字段用于包含大量数据的外键。但在本例中,我想展示一些关于日射强度计和日射强度计数值以下的元数据(InlineAdmin但分页)。TBH thin我将手动完成这一切。我最终对它进行了测试,它似乎没有那么简单,因为InlineAdminFormSet使用一个生成器作为iter操作符,它返回InlineAdminForms。。。
    from django.contrib.admin.views.main import ChangeList
    from django.core.paginator import EmptyPage, InvalidPage, Paginator
    
    class InlineChangeList(object):
        can_show_all = True
        multi_page = True
        get_query_string = ChangeList.__dict__['get_query_string']
    
        def __init__(self, request, page_num, paginator):
            self.show_all = 'all' in request.GET
            self.page_num = page_num
            self.paginator = paginator
            self.result_count = paginator.count
            self.params = dict(request.GET.items())
    
    
    class MyInline(admin.TabularInline):
        per_page = 10
        template = 'admin/edit_inline/anyname.html'
        model = Mymodel
        extra = 0
        can_delete = False
    
        def get_formset(self, request, obj=None, **kwargs):
            formset_class = super(MyInline, self).get_formset(
                request, obj, **kwargs)
            class PaginationFormSet(formset_class):
                def __init__(self, *args, **kwargs):
                    super(PaginationFormSet, self).__init__(*args, **kwargs)
    
                    qs = self.queryset
                    paginator = Paginator(qs, self.per_page)
                    try:
                        page_num = int(request.GET.get('page', ['0'])[0])
                    except ValueError:
                        page_num = 0
    
                    try:
                        page = paginator.page(page_num + 1)
                    except (EmptyPage, InvalidPage):
                        page = paginator.page(paginator.num_pages)
    
                    self.page = page
                    self.cl = InlineChangeList(request, page_num, paginator)
                    self.paginator = paginator
    
                    if self.cl.show_all:
                        self._queryset = qs
                    else:
                        self._queryset = page.object_list
    
            PaginationFormSet.per_page = self.per_page
            return PaginationFormSet