Django-tables2: طريقة سهلة لإضافة الأعمدة ديناميكيًا

تم إنشاؤها على ١٧ أبريل ٢٠١٢  ·  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()     

في الحقيقة ، المشكلة الوحيدة التي أستخدمها مثل هذه هي حقيقة أنه لا يمكنني ببساطة استدعاء super () أخيرًا يجب أن تكون في المنتصف. أعتقد ذلك لأن الفئة الوصفية لا تبحث فعليًا عن base_columns على نفسها ولكن فقط في النماذج الموروثة. حقًا يبدو هذا أكثر فوضوية من حقول self. في نماذج django.

التعليق الأكثر فائدة

هذا غريب
أقوم بإضافة أعمدة ديناميكية بمجرد إلحاقها بـ 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',)

مثال حيث نقوم بتصفية التواريخ ثم يتم إضافة تاريخين ضالين في النهاية
image

تم إصلاحه في 817d711 باستخدام الوسيطة extra_columns

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات