Django-tables2: рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХреЙрд▓рдо рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рд╣рдЬ рддрд░реАрдХрд╛

рдХреЛ рдирд┐рд░реНрдорд┐рдд 17 рдЕрдкреНрд░реИрд▓ 2012  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: jieter/django-tables2

рд╕рднреА рдореЗрдЯрд╛ рдореИрдЬрд┐рдХ рдЪрд▓ рд░рд╣реЗ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:

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

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдмрд╕ рд╕реБрдкрд░() рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдЗрд╕реЗ рдмреАрдЪ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рдЗрд╕рдХрд╛ рдЕрдиреБрдорд╛рди рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрдЯрд╛ рдХреНрд▓рд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╕_рдХреЙрд▓рдо рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рд╡рд┐рд░рд╛рд╕рдд рд╡рд╛рд▓реЗ рдореЙрдбрд▓ рдкрд░ рджреЗрдЦрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ django рд░реВрдкреЛрдВ рдкрд░ self.fields рд╕реЗ рдХрд╣реАрдВ рдЬреНрдпрд╛рджрд╛ рдЧрдиреНрджрд╛ рд▓рдЧрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдЧрд▓рдд рд╣реИ
рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ self.base_columns рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдЧрддрд┐рд╢реАрд▓ рдХреЙрд▓рдо рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ:

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

рдПрдХ рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд▓рдЧреА рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ, рдореИрдВ рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдиреБрд░реЛрдз рдкрд░ рдЬреЛ рднреА рдХреЙрд▓рдо рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рд╡рд╣ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрддрд┐рд╢реАрд▓ рдХреЙрд▓рдо рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореБрдЭреЗ рдорд┐рд▓рд╛ рдерд╛:

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

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рдЧрд▓рдд рд╣реИ
рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ self.base_columns рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдЧрддрд┐рд╢реАрд▓ рдХреЙрд▓рдо рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ:

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

рдПрдХ рдмрд╛рдд рдЬреЛ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд▓рдЧреА рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдХрд░рдиреЗ рд╕реЗ, рдореИрдВ рд╡рд░реНрдЧ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдЙрджрд╛рд╣рд░рдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдирд╣реАрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдиреБрд░реЛрдз рдкрд░ рдЬреЛ рднреА рдХреЙрд▓рдо рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рд╡рд╣ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдж рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЧрддрд┐рд╢реАрд▓ рдХреЙрд▓рдо рдХрд╛ рд╕рдорд╛рдзрд╛рди рдореБрдЭреЗ рдорд┐рд▓рд╛ рдерд╛:

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

рдореЗрд░реЗ рдкрд╛рд╕ @jmfederico рдЬреИрд╕рд╛ рд╣реА рдореБрджреНрджрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдЕрдкрдирд╛ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИрдХ (рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб) рд░рдЦрдирд╛ рдкрдбрд╝рд╛ рд╣реИред рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреЙрд▓рдо рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рдХреЛрдИ рдмреЗрд╣рддрд░ рд╕реБрдЭрд╛рд╡ рд╣реИ? рдореЗрд░реЗ рдкрд╛рд╕ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдХреНрд╡реЗрд░реА рд╕реЗ рддрд┐рдерд┐рдпреЛрдВ рд╡рд╛рд▓реА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдХреИрд╕реЗ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд┐рдерд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдореИрдВ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ рдХреНрдпреЛрдВ рдХрднреА-рдХрднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрд▓рдо рдереЗ рдЬреЛ рдХреНрд╡реЗрд░реА рдореЗрдВ рдирд╣реАрдВ рдереЗ рдФрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рд╡рд╣реА рд╕рдорд╕реНрдпрд╛ рдереАред

рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдБ рдореЗрд░реА рдЯреЗрдмрд▓ рдХреНрд▓рд╛рд╕ рд╣реИ

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

рдЙрджрд╛рд╣рд░рдг рдЬрд╣рд╛рдВ рд╣рдо рддрд╛рд░реАрдЦреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЕрдВрдд рдореЗрдВ 2 рдЖрд╡рд╛рд░рд╛ рддрд┐рдерд┐рдпрд╛рдВ рдЬреЛрдбрд╝ рджреА рдЬрд╛рддреА рд╣реИрдВ
image

extra_columns рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 817d711 рдореЗрдВ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

mpasternak picture mpasternak  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

applegrew picture applegrew  ┬╖  17рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

foldedpaper picture foldedpaper  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

brianmay picture brianmay  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

wtfrank picture wtfrank  ┬╖  32рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ