我有这个简单的django模型,由传感器和特定传感器的值组成。
每个日射强度计的值的数量很高(> 30k)。是否有可能在特定日期前对PyranometerValues
进行分页,或者将一个分页器应用于管理员内联视图?
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')
答案 0 :(得分:5)
如果有人要求这样做,我发现this comment问题的a django-suit中的分页TabularInline
子类的实现很好(虽然被描述为“非常hacky”)。
对于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
答案 1 :(得分:2)
您是否检查过raw_id_fields属性?我想你可能会发现它很有用。
答案 2 :(得分:1)
由于django-admin主要是模板问题(只需要将模板重新定义为某些django-admin-tools部分),我有一个想法。
Django的分页模块,如linaro-django-pagination或endless-pagination,它们提供模板标签,以便在可迭代的情况下分页。
如果您可以找到负责显示内联模型的模板,您可以将其复制到项目中,然后尝试向其添加{%load pagination_tags%}并对内联进行分页。
我没有对它进行过测试,也没有仔细考虑过,但除了验证之外,我看不出它是如何失败的。试试并告诉我们。
答案 3 :(得分:1)
对于任何版本的Django ,请按照以下步骤操作:
python3.7/site-packages/django/contrib/admin/templates/admin/edit_inline/tabular.html
在您的app/templates/admin/edit_inline/anyname.html
中复制它在</table>
和</fieldset>
标记之间添加 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>…</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>…</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>
2。转到您的 admin.py 文件:
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
答案 4 :(得分:0)
好吧,也许动态生成的过滤器会有所帮助:
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter
此外,管理员有一个很好的GET类型查询,如:
本地主机:8000 /管理/ pyranometervalues /值= 10.0
您可以将日期指定为:
管理员/ pyranometervalues / timestamp_ 年= 2011&安培;时间戳 _month = 10安培; timestamp__day = 13
依旧...不幸的是我不知道在admin中进行此查询的简短方法。有任何想法吗? :)
编辑:这只是为了缩小查询范围,与分页无关;)