Ответ 1
Вы отметили raw_id_fields атрибут? Я думаю, вы можете найти это полезным.
У меня есть эта простая модель 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')
Вы отметили raw_id_fields атрибут? Я думаю, вы можете найти это полезным.
Если кто-то требует этого, я нашел эту симпатичную (хотя и описанную как "довольно хакерскую" ) реализацию подкласса 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
Поскольку django-admin в основном относится к шаблонам (необходимо только переопределить шаблоны для некоторых частей django-admin-tools для i18n), у меня есть идея.
. Модули разбиения на страницы для Django, такие как линаро-джинго-разбиение на страницы или бесконечное разбиение на страницы, которые предоставляют шаблонные теги для разбиения на страницы, при условии, что они являются итерабельными.
Если вы можете найти шаблон, отвечающий за отображение встроенных моделей, вы можете скопировать его в свой проект, а затем попробуйте добавить к нему {% load pagination_tags%} и разбивать страницы на строки.
Я не тестировал его и не думал об этом очень тщательно, но, кроме проверки, я не вижу, как он может потерпеть неудачу. Просто испытайте и сообщите нам.
Ну, возможно, динамически сгенерированные фильтры помогут:
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: это только для сужения вашего запроса, не имеет ничего общего с разбиением на страницы;)