2013-07-31 1 views
2

모델 및 열 이름의 튜플을 취하는 일반 테이블 뷰를 만들고 모델의 지정된 열을 표시하려고합니다. 내 문제는 내부 메타 클래스입니다. django-table2 : 테이블 서브 클래스 화 및 메타 내부 클래스 속성

이 두 모델을 가정

# models.py 

from django.db import models 


class Model_a(models.Model): 
    column_a_1 = models.Field() 
    column_a_2 = models.Field() 
    column_a_3 = models.Field() 
    column_a_4 = models.Field() 
    column_a_5 = models.Field() 


class Model_b(models.Model): 
    column_b_1 = models.Field() 
    column_b_2 = models.Field() 
    column_b_3 = models.Field() 
    column_b_4 = models.Field() 
    column_b_5 = models.Field() 

목적은 주어진 순서 열의 일부 적절한 테이블을 생성하는 하나의 뷰를 갖는 것이다.

# urls.py 

from django.conf.urls import patterns, url 
import myapp.views as myviews 
import myapp.models as mymodels 


urlpatterns = patterns('', 
         url(r'^table_a/$', 
          myviews.show_table, 
          { 'model': mymodels.Model_a, 
           'columns': ("column_a_1", "column_a_2", "column_a_3") }), 
         url(r'^table_b/$', 
          myviews.show_table, 
          { 'model': mymodels.Model_b, 
           'columns': ("column_b_5", "column_b_2") })) 

그리고이 같은 간단한 views.py : 그래서, 나는이 같은 urls.py를했습니다

# views.py 

from django.shortcuts import render 
from django_tables2 import RequestConfig 
import myapp.tables as mytables 


def show_table(request, model, columns): 
    entries = model.objects.all() 
    table = mytables.ModelTable(entries, model, columns) 
    RequestConfig(request).configure(table) 
    return render(request, 'table_view.html', {'dynamic-table': table}) 

의 핵심은 tables.py 내부 표 서브 클래 싱에 있습니다

# tables.py 

from django_tables2 import import Table 


class ModelTable(Table): 

    class Meta: 
     pass 

    def __init__(self, data, model, columns, order_by=None, orderable=None, empty_text=None, 
       exclude=None, attrs=None, sequence=None, prefix=None, 
       order_by_field=None, page_field=None, per_page_field=None, 
       template=None, sortable=None, default=None): 
     self.Meta.model = model 
     self.Meta.fields = columns 
     self.Meta.sequence = columns 
     super(ModelTable, self).__init__(data, order_by, orderable, empty_text, 
       exclude, attrs, sequence, prefix, 
       order_by_field, page_field, per_page_field, 
       template, sortable, default) 

분명히 표 하위 ​​클래스 이니셜 라이저에서 Table.Meta의 특성을 설정하는 방법을 이해하지 못했습니다. 내 템플릿에 {% render_table dynamic-table %}을 사용할 때 비어있는 테이블 (보이지는 않음)을 얻을 수 있지만 제대로 작동하는 페이지 매거기를 얻을 수 있습니다.

내 실수는 어디에서 왔습니까?

답변

1

해결되었습니다. 문제는 Meta 클래스에 관한 것이 었습니다. ModelTable 이니셜 라이저 전에 "살기"때문에 이니셜 라이저에 메타 속성을 설정하는 것은 무의미했습니다.

계시록은 this QA입니다.

특수 클래스를 dinamically 정의하는 새로운 메소드를 정의해야합니다.

# tables.py 

from django_tables2 import import Table 


class ModelTable(Table): 
    class Meta: 
     pass 


def table_maker(model, columns): 
    meta_class = type('Meta', (ModelTable.Meta,), {'model':model, 'fields':columns}) 
    table_class = type(model._meta.object_name + 'Table', (ModelTable,), {'Meta':meta_class}) 
    return table_class 

그리고 그 결과도 views.py는 조금 변경 : 여기 나의 새로운 tables.py이다

# views.py 

from django.shortcuts import render 
from django_tables2 import RequestConfig 
import myapp.tables as mytables 


def show_table(request, model, columns): 
    entries = model.objects.all() 
    table = mytables.table_maker(model, columns)(entries) 
    RequestConfig(request).configure(table) 
    return render(request, 'table_view.html', {'dynamic-table': table}) 

이 지금이 예상 작품으로

!