2013-05-22 10 views
7

Trong dự án Django của tôi, tôi cần phải có các bảng có cột động và phụ thuộc vào những gì có trong cơ sở dữ liệu. Vì vậy, tôi tìm thấy một giải pháp trong here và nó hoạt động nhưng với một vấn đề nhỏ. Đây là lớp học với một bảng tôi đang mở rộng động:Django-tables2 - tự động thêm cột vào bảng - không thêm attrs vào thẻ bảng trong html

class ClientsTable(tables.Table): 
    class Meta: 
     model = Client 
     attrs = {"class": "paleblue", "orderable":"True", "width":"100%"} 
     fields = ('name',) 

    def __init__(self, *args, **kwargs): 
     super(ClientsTable, self).__init__(*args, **kwargs) 
     self.counter = itertools.count() 

    def render_row_number(self): 
     return '%d' % next(self.counter) 

    def render_id(self, value): 
     return '%s' % value 

Và đây là phương pháp mở rộng các lớp:

def define_table(roles): 
    attrs = dict((r.name, tables.Column() for r in roles) 
    klass = type('DynamicTable', (ClientsTable,), attrs) 
    return klass 

Khi tôi là tạo ra một bảng trong views.py như thế này:

table = define_table(roles)(queryset) 

bảng này cho thấy các cột như tôi muốn, nhưng trong mã html tôi thấy rằng nó bỏ attrs:

{"class": "paleblue", "orderable":"True", "width":"100%"} 

Vì vậy, không có kiểu css cho paleblue, điều quan trọng đối với tôi. Tôi cảm thấy rằng nó có thể là một cái gì đó với lớp Meta nhưng các lĩnh vực và mô hình đang làm việc, vì vậy tôi không có ý tưởng tại sao attrs không.

Trả lời

6

Trước hết, meta options are not inherited trong django-tables2. Vì vậy, bạn có thể kiểm tra các cách giải quyết được thảo luận trong vấn đề để xem có điều gì đó phù hợp hay không, bạn có thể thêm một lớp Meta vào bảng động của mình. Để làm điều đó, bạn có thể phương pháp define_table của bạn như thế này:

 
def define_table(roles): 
    attrs = dict((r.name, tables.Column() for r in roles) 
    attrs['Meta'] = type('Meta',(), dict(attrs={"class":"paleblue", "orderable":"True", "width":"100%"})) 
    return klass 

Rất tiếc sau hơn hai năm, tôi nhận thấy rằng có một lỗi trong mã của tôi - Tôi muốn quên để bao gồm các dòng klass = type('DynamicTable', (ClientsTable,), attrs) trước return klass trên. Tôi đang thêm nó ngay bây giờ để hoàn thành.

+0

đẹp thứ! Không giải quyết chính xác vấn đề của tôi, nhưng tôi có thể sửa đổi đoạn mã của bạn để giải quyết vấn đề của mình và học được rất nhiều về hành động của Python 'type' và meta class. Thx một đống! – schwobaseggl

+0

Vui vì tôi đã giúp! Tôi cũng đã viết nhiều bài đăng khác nhau để thực hiện các công cụ có loại tại blog của tôi: http://spapas.github.io/category/django.html – Serafeim

3

Đối với bất kỳ ai đang tìm kiếm điều này ngay bây giờ, từ django-tables2 1.10, bạn thêm cột động vào bảng bằng cách chuyển extra_columns tới hàm tạo Table.

extra_columns phải là danh sách các bộ dữ liệu, xác định tên cột và đối tượng Column, ví dụ:

class MyTable(Table): 
    static_column = Column() 

mytable = MyTable(extra_columns=[('dynamic_column', Column())] 

Xem tài liệu API tại địa chỉ: http://django-tables2.readthedocs.io/en/latest/pages/api-reference.html#django_tables2.tables.Table