Django管理中内联模型的分页器

2024-03-29 08:20:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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')      

Tags: djangoname模型gt视图modelmodels传感器
3条回答

你检查过raw_id_fields属性吗?我想你会发现它很有用。

由于django管理主要是一个模板问题(只需要将模板重新定义为i18n的一些django管理工具部分),我有一个想法。

是Django的分页模块,比如linaro Django分页或无休止的分页,它们提供模板标记来对任何给定的内容进行分页。

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

我没有测试过它,也没有想得很透彻,但除了验证,我不知道它怎么会失败。只是测试和告诉我们。

如果有人需要这个,我在a django-suit问题的this comment中找到了一个分页TabularInline子类的好实现(尽管被描述为“相当黑”)。

对于Django 1.6,它需要一个模板更改并子类化这个PaginationInline类:

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

相关问题 更多 >