Django-tables2 - 刷新页面后更改列名称

时间:2017-08-24 08:21:37

标签: python django django-tables2

我面临DjangoDjango-tables2的非常奇怪的行为。

我使用表来帮助呈现多种类型的文档。

为简单起见,有两种类型的文件 - “faktura”和“dobropis”。

'dobropis'必须有第一列标有“DobropisujemeVám”和“faktura” - “Názovpoložky”+这些列相等。

所以我正在检查,如果Document __init__函数中的Document类型是'faktura'或'dobropis'并相应地设置

self.base_columns['column'].verbose_name = ...

奇怪的是它可以工作,但只有在第二次刷新之后。

情况:我已打开'faktura'页面 - 我可以看到'Názovpoložky',这是好的。然后我打开'dobropis'页面再次看到'Názovpoložky'标签。然后,如果我再次刷新,有'DobropisujemeVám'。然后,每次刷新后,我看到正确的标签 - 'DobropisujemeVám'。但是,如果我打开'faktura'页面,第一次也有'DobropisujemeVám',第二次刷新后它恢复正常。

class PolozkyTable(tables.Table):
    nazov_polozky = tables.columns.Column(orderable=False)
    pocet = tables.columns.Column(orderable=False)
    jednotka = tables.columns.Column(orderable=False)
    cena = tables.columns.Column(orderable=False, verbose_name=u'Jednotková cena')
    zlava = tables.columns.Column(orderable=False)
    dph = tables.columns.Column(orderable=False)
    celkom = tables.columns.Column(orderable=False)

    class Meta:
        model = Polozka
        fields = ['nazov_polozky', 'pocet', 'jednotka', 'cena', 'zlava', 'dph', 'celkom']
        attrs = {'class': 'table table-striped table-hover'}

    def __init__(self, *args, **kwargs):
        typ = kwargs.pop('typ')
        super(PolozkyTable, self).__init__(*args, **kwargs)
        if typ == 'dobropis':
            self.base_columns['nazov_polozky'].verbose_name = u'Dobropisujeme Vám'
            self.exclude = ['zlava', 'dph']
        else:
            self.base_columns['nazov_polozky'].verbose_name = u'Názov položky'


    def render_cena(self, record):
        return '{} {}'.format(record.cena, record.doklad.get_fakturacna_mena_display().encode('utf-8'))

    def render_celkom(self, record):
        return '{} {}'.format(record.celkom, record.doklad.get_fakturacna_mena_display().encode('utf-8'))


@login_required
def doklad_detail(request):
    doklad = get_object_or_404(Doklad, pk=request.GET.get('id'))
    polozky_table = PolozkyTable(doklad.polozky.all(),typ=doklad.typ)
    return render(request, 'pdf/{}_pdf_template.html'.format(doklad.typ),
                  {'doklad': doklad, 'polozky_table': polozky_table})

这个项目没有缓存,我真的不知道它可能是什么。

你知道吗?

修改

此外,当我重新启动服务器后打开'faktura'时,它显示了来自'NázovPoložky'而不是'Názovpoložky'。这是另一个奇怪的事情,因为我搜索了整个项目的区分大小写的'NázovPoložky'并且没有这样的字符串。

EDIT2:

我已经解决了为'dobropis'创建单独的表格,但我仍然很好奇导致了这个问题。我的同事在他的电脑上遇到了同样的问题。

1 个答案:

答案 0 :(得分:0)

您不应该在base_columns方法中修改__init__ - 您正在更改类的值,因此它也会影响其他视图。

base_columns调用super() have already been copied之前,您需要更改它们,因此更改只会在您下次访问视图时显示。

看起来您应该修改self.columns。这应该只影响实例。尝试设置header而不是verbose_name

self.columns['nazov_polozky'].header = u'Dobropisujeme Vám'