Подтвердить что ты не робот

Paginator для встроенных моделей в django admin

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

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

Ответ 1

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

Ответ 2

Если кто-то требует этого, я нашел эту симпатичную (хотя и описанную как "довольно хакерскую" ) реализацию подкласса 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

Ответ 3

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

. Модули разбиения на страницы для Django, такие как линаро-джинго-разбиение на страницы или бесконечное разбиение на страницы, которые предоставляют шаблонные теги для разбиения на страницы, при условии, что они являются итерабельными.

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

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

Ответ 4

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

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

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

локальный: 8000/администратор/pyranometervalues ​​значение/= 10,0

Вы можете указать дату как:

администратор/pyranometervalues ​​/timestamp_year = 2011 &? Timestamp_month = 10 & timestamp__day = 13

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

EDIT: это только для сужения вашего запроса, не имеет ничего общего с разбиением на страницы;)