Django-tables2: Manière intuitive d'ajouter dynamiquement des colonnes

Créé le 17 avr. 2012  ·  3Commentaires  ·  Source: jieter/django-tables2

En raison de toute la méta magie en cours, j'utilise actuellement :

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()     

vraiment le seul problème avec moi en l'utilisant comme ça est le fait que je ne peux pas simplement appeler super () en dernier, il doit être au milieu. Je suppose que c'est parce que la classe méta ne recherche pas réellement base_columns sur elle-même mais uniquement sur les modèles hérités. Vraiment, cela semble bien plus compliqué que les self.fields sur les formulaires Django.

Commentaire le plus utile

C'est étrange
J'ajoute des colonnes dynamiques en les ajoutant simplement à self.base_columns :

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

Une chose que j'ai trouvée ennuyeuse est qu'en faisant cela, je modifie l'attribut de classe, pas l'attribut d'instance, donc toute colonne que j'ajoute sur une demande, sera affichée sur chaque demande ultérieure à la table, la solution aux vraies colonnes dynamiques que j'ai trouvées a été:

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

Tous les 3 commentaires

C'est étrange
J'ajoute des colonnes dynamiques en les ajoutant simplement à self.base_columns :

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

Une chose que j'ai trouvée ennuyeuse est qu'en faisant cela, je modifie l'attribut de classe, pas l'attribut d'instance, donc toute colonne que j'ajoute sur une demande, sera affichée sur chaque demande ultérieure à la table, la solution aux vraies colonnes dynamiques que j'ai trouvées a été:

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

J'ai le même problème que @jmfederico et j'ai dû mettre en place son hack suggéré (solution de contournement). Existe-t-il une meilleure suggestion sur la façon d'ajouter dynamiquement des colonnes à une table ? J'ai un tableau avec les dates d'une requête en haut, donc selon la façon dont il est filtré, il peut avoir des dates plus ou moins différentes. Je n'arrivais pas à comprendre pourquoi nous avions parfois des colonnes supplémentaires qui ne figuraient pas dans la requête et nous avons compris qu'il s'agissait du même problème.

Pour référence voici ma classe de table

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',)

Exemple où on filtre les dates puis il y a 2 dates errantes ajoutées à la fin
image

corrigé dans 817d711 en utilisant l'argument extra_columns

Cette page vous a été utile?
0 / 5 - 0 notes