Django-tables2: Cara intuitif untuk menambahkan kolom secara dinamis

Dibuat pada 17 Apr 2012  ·  3Komentar  ·  Sumber: jieter/django-tables2

Karena semua keajaiban meta terjadi, saat ini saya menggunakan:

class StatsTable(tables.Table):
   class Meta:
        orderable = False
        attrs = {'class': 'tablesorter'}

    def __init__(self, form, request, *args, **kwargs):
        rf_values = form.get_values()
        rf_annotations = form.get_annotations()
        rf_filter = form.get_filter()
        rf_calculations = form.get_calculations()                  
        data = list(
            HourlyStat.objects.filter(**rf_filter).values(*rf_values).annotate(**rf_annotations).order_by('-clicks')
        ) 
        super(StatsTable, self).__init__(data, *args, **kwargs)      
        columns = rf_values + rf_annotations.keys() + rf_calculations
        for col in columns:
            self.base_columns[col] = tables.Column()     

benar-benar satu-satunya masalah dengan saya menggunakannya seperti ini adalah kenyataan bahwa saya tidak bisa begitu saja memanggil super() terakhir itu harus di tengah. Saya kira itu karena kelas meta tidak benar-benar mencari base_columns pada dirinya sendiri tetapi hanya pada model yang diwarisi. Sungguh ini sepertinya jauh lebih berantakan daripada self.fields pada formulir Django.

Komentar yang paling membantu

Ini aneh
Saya menambahkan kolom dinamis hanya dengan menambahkannya ke self.base_columns:

self.base_columns['column_name'] = tables.Column()

Satu hal yang menurut saya menjengkelkan adalah dengan melakukan itu, saya memodifikasi atribut class, bukan atribut instance, jadi kolom apa pun yang saya tambahkan pada permintaan, akan ditampilkan pada setiap permintaan berikutnya ke tabel, solusi untuk kolom dinamis nyata yang saya temukan dulu:

class ComponenteContableColumns(tables.Table):

    """Table that shows ComponentesContables as columns."""

    a_static_columns = tables.Column()

    def __init__(self, *args, **kwargs):
        # Create a copy of base_columns to restore at the end.
        self._bc = copy.deepcopy(self.base_columns)
        # Your dynamic columns added here:
        if today is 'monday':
            self.base_columns['monday'] = tables.Column()
        if today is 'tuesday':
            self.base_columns['tuesday'] = tables.Column()
        super().__init__(*args, **kwargs)
        # restore original base_column to avoid permanent columns.
        type(self).base_columns = self._bc

Semua 3 komentar

Ini aneh
Saya menambahkan kolom dinamis hanya dengan menambahkannya ke self.base_columns:

self.base_columns['column_name'] = tables.Column()

Satu hal yang menurut saya menjengkelkan adalah dengan melakukan itu, saya memodifikasi atribut class, bukan atribut instance, jadi kolom apa pun yang saya tambahkan pada permintaan, akan ditampilkan pada setiap permintaan berikutnya ke tabel, solusi untuk kolom dinamis nyata yang saya temukan dulu:

class ComponenteContableColumns(tables.Table):

    """Table that shows ComponentesContables as columns."""

    a_static_columns = tables.Column()

    def __init__(self, *args, **kwargs):
        # Create a copy of base_columns to restore at the end.
        self._bc = copy.deepcopy(self.base_columns)
        # Your dynamic columns added here:
        if today is 'monday':
            self.base_columns['monday'] = tables.Column()
        if today is 'tuesday':
            self.base_columns['tuesday'] = tables.Column()
        super().__init__(*args, **kwargs)
        # restore original base_column to avoid permanent columns.
        type(self).base_columns = self._bc

Saya memiliki masalah yang sama dengan @jmfederico dan harus menerapkan hack (solusi) yang disarankan. Apakah ada saran yang lebih baik tentang cara menambahkan kolom secara dinamis ke tabel? Saya memiliki tabel dengan tanggal dari kueri di bagian atas, jadi tergantung pada cara penyaringannya, mungkin ada lebih banyak atau lebih sedikit dan tanggal yang berbeda. Saya tidak dapat mengetahui seumur hidup saya mengapa kadang-kadang kami memiliki beberapa kolom tambahan yang tidak ada dalam kueri dan menemukan bahwa itu adalah masalah yang sama.

Untuk referensi di sini adalah kelas meja saya

class ActivitySummaryTable(TableWithRawData):
    activity = tables.Column(verbose_name=_('Activity'), orderable=False)
    # the rest of the columns will be added based on the filter provided

    def __init__(self, extra_cols, *args, **kwargs):
        """Pass in a list of tuples of extra columns to add in the format (colunm_name, column)"""
        # Temporary hack taken from: https://github.com/bradleyayers/django-tables2/issues/70 to avoid the issue where
        # we got the same columns from the previous instance added back
        # Create a copy of base_columns to restore at the end.
        _bc = copy.deepcopy(self.base_columns)
        for col_name, col in extra_cols:
            self.base_columns[col_name] = col
        super(ActivitySummaryTable, self).__init__(*args, **kwargs)
        # restore original base_column to avoid permanent columns.
        type(self).base_columns = _bc

    class Meta:
        attrs = {'class': 'table'}
        order_by = ('activity',)

Contoh di mana kita menyaring tanggal dan kemudian ada 2 tanggal nyasar ditambahkan di akhir
image

diperbaiki di 817d711 menggunakan argumen extra_columns

Apakah halaman ini membantu?
0 / 5 - 0 peringkat