Paginator для встроенных моделей в админке django - PullRequest
23 голосов
/ 12 июля 2011

У меня есть эта простая модель django, состоящая из датчика и значений для конкретного датчика.Количество значений на пиранометр велико (> 30 КБ).Можно ли каким-то образом выполнить разбиение на страницы PyranometerValues к определенному дню или, вообще, применить paginator к внутреннему виду администратора?

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

Ответы [ 4 ]

5 голосов
/ 04 мая 2015

Если кому-то это нужно, я нахожу эту замечательную (хотя и описанную как "довольно хакерскую") реализацию подкласса TabularInline в этот комментарий из django-suit проблему .

Для 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
2 голосов
/ 09 сентября 2011

Вы проверили атрибут raw_id_fields ?Я думаю, что вы могли бы найти это полезным.

1 голос
/ 04 октября 2011

Поскольку django-admin - это в основном вопрос шаблонов (требуется только для переопределения шаблонов в i18n некоторых частях django-admin-tools), у меня есть идея.

Это модули разбиения на страницы для Django, такие как linaro-django-pagination или endless-pagination, которые предоставляют шаблоны тегов для разбиения на страницы всего, что итеративно.

Если вы можете найти шаблон, отвечающий за отображение встроенных моделей, вы можете скопировать его в свой проект, а затем попытаться добавить к нему {% load pagination_tags%} и разбить на страницы встроенные модели.

Я не проверял и не думал об этом очень тщательно, но кроме проверки, я не вижу, как это могло бы потерпеть неудачу. Просто протестируйте и сообщите нам.

0 голосов
/ 14 октября 2011

Ну, может быть, динамически сгенерированные фильтры помогут:

https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

Кроме того, у администратора есть хороший запрос типа GET, например:

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

Вы можете указать дату следующим образом:

admin / pyranometervalues ​​/? timestamp_ year = 2011 × tamp _month = 10 × tamp__day= 13

и так далее ... К сожалению, я не знаю более короткого способа сделать этот запрос в админке.Есть идеи?:)

РЕДАКТИРОВАТЬ: это только для сужения вашего запроса, не имеет никакого отношения к нумерации страниц;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...