2013-07-31 2 views
2

Я пытаюсь создать общий табличный вид, который возьмет модель и кортеж имен столбцов и покажет данные столбцы модели. Моя проблема связана с внутренним классом Meta.django-table2: Атрибуты подкласса таблицы и атрибуты внутреннего класса Meta

Пусть эти две модели:

# 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 вроде этого:

# 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 так:

# 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 %} в своем шаблоне, я получаю пустой пустую таблицу (так не видно), но хорошо работает с paginator.

Где моя ошибка?

ответ

1

Решено. Проблема заключалась в мета-классе: он «живет» перед инициализатором ModelTable, поэтому установка атрибутов Meta в указанном инициализаторе была бессмысленной.

Откровение cames reading this QA.

Я должен определить новый метод, который динамически определяет специализированный класс; вот мой новый tables.py:

# 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 изменяет немного:

# 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}) 

Теперь он работает, как ожидалось!

Смежные вопросы