2016-12-06 45 views
0

我无法按模型属性对表排序。我知道我应该在列中设置访问器,以便django-tables2知道要处理的字段,但它不起作用。无法按模型的属性对排序表进行排序(访问器集)

这是表:

class ScansTable(tables.Table): 
    site = tables.columns.Column(accessor='occurence.site', verbose_name='Site') 
    url = tables.columns.TemplateColumn("""<a href="{{ record.occurence.url }}">{{ record.occurence.url|truncatechars:20 }}</a>""", 
             accessor='occurence.url', verbose_name='Url') 
    price = tables.columns.TemplateColumn(u"""{{ record.price }} €""") 
    date = tables.columns.Column(accessor='date',order_by='date') 
    time = tables.columns.Column(accessor='time',order_by='time') 
    class Meta: 
     model = Scan 
     fields = ('date', 'time', 'site', 'url', 'valid', 'price') 
     attrs = {'id': 'cans_table', 
       'class': 'table',} 

这是扫描模式:

class Scan(models.Model): 
    occurence = models.ForeignKey('Occurence', related_name='scans') 
    datetime = models.DateTimeField() 
    price = models.DecimalField(max_digits=20,decimal_places=2,null=True,blank=True,verbose_name='Price') 
    valid = models.BooleanField(default=True,verbose_name='Valid') 

    def __unicode__(self): 
     return u'{} {} {} {}'.format(self.occurence, self.datetime, self.price, u'OK' if self.valid else 'NOK') 


    @property 
    def date(self): 
     return self.datetime.date() 

    @property 
    def time(self): 
     return self.datetime.time() 

的观点:当我不

def scans(request): 
    ... 
    scans = Scan.objects.filter(occurence__product=product) 

    scans_table = ScansTable(scans) 
    RequestConfig(request).configure(scans_table) 
    scans_table.paginate(page=request.GET.get('page', 1), per_page=50) 

    return render(request,"dashboard_app/scans.html",context={'scans_table':scans_table}) 

表进行适当的renderd想对它进行排序。当我点击的时间(例如),它返回:

无法解析关键字u'time”到现场。选择是:datetime, groups,id,occurence,occurence_id,price,valid

你知道问题在哪里吗?

回答

0

这很奇怪什么类型的产品?您将显示Occurence模型及其在视图中的值

+0

我不明白...产品是一个模型它可以有多个Occurence对象。 –

+0

好吧,你传递什么样的价值是什么类型的产品它是一个产品的实例??? –

0

似乎该模型的已定义属性/方法不可用于查询集中的排序/过滤。我不完全理解为什么是这样。解决方案是在Scan模型上不定义datetime作为属性,而是将它们注释到用于填充数据的查询集。

from django.db import models 

def scans(request): 
    ... 
    scans = Scan.objects.filter(occurence__product=product).annotate(
     date=models.F('datetime__date'), 
     time=models.F('datetime__time') 
    ) 
    ... 

有关字段查找,请参阅文档here。你也可以使用tables特定列的那些领域 - 注意,你不需要定义存取现在的成绩已经在查询集:

class ScansTable(tables.Table): 
    ... 
    date = tables.DateColumn() 
    time = tables.TimeColumn() 
    ... 
相关问题