์๋ ํ์ธ์,
๋ค์ ํ ์ด๋ธ์ด ์์ต๋๋ค.
class BaseTable(tables.Table):
select_column = tables.CheckBoxColumn(verbose_name='', empty_values=('NA',))
class Meta:
attrs = {'class' : 'cool_table'}
class EditableTable(BaseTable):
edit_column = EditIconColumn(verbose_name=_('Edit'))
def set_editable(self, flag):
if flag:
self.base_columns['edit_column'].visible = True
else:
self.base_columns['edit_column'].visible = False
class RoomTable(EditableTable):
number = tables.Column()
speciality = tables.Column()
photo = ImageViewColumn(accessor='room_type.photo')
RoomTable
๋ ๋๋งํ ๋ ์์ฑ๋ <table>
์ class
์์ฑ์ด ์์ต๋๋ค. Meta
ํด๋์ค๋ฅผ BaseTable
์์ RoomTable
๋ก ์ด๋(๋๋ ๋ณต์ฌ)ํ ๋๋ง ํด๋น ์์ฑ์ ์ป์ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ฒ๊ทธ์ ๋๊น ์๋๋ฉด ์๋ชป ์ฌ์ฉํ๊ณ ์์ต๋๊น?
๋ณด๊ณ ํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ๋ฒ๊ทธ์ ๋๋ค. ์ด์ ๋ด ํ ์ผ ๋ชฉ๋ก์ ๋งจ ์์ ์์ต๋๋ค.
๊ฐ์ฌ ํด์.
๊ทธ๋์ ๋๋ ์ด๊ฒ์ ๋ํ ์๋ฃจ์
๊ตฌํ์ ๊ฑฐ์ ๋ง์ณค๊ณ Meta
์์์ ์ํด Django ์คํ์ผ์ ๋ฐ๋ฅด๊ณ ์๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์ต๋๋ค.
class Meta(Parent.Meta):
...
๊ทธ๋์ ์ด์ ๋๋ ๊ทธ๊ฒ์์ ๋ฒ์ด๋๋ ๊ฒ์ด ์ค์ ๋ก ์ข์ ์๊ฐ์ธ์ง ๊ถ๊ธํด์ง๊ธฐ ์์ํ์ต๋๋ค. ๋๋ ํญ์ ์ฒซ ๋ฒ์งธ ์๋ธ ํด๋์ค์์, ์ด์จ๋ ์ผ์นํ์ง ์๊ฒ๋์์ต๋๋ค ๊ฐ์ django_tables2.Table
ํ ๋น์ ์๊ฒ _don't_ ํ์ class Meta(django_tables2.Tables):
ํ์ง๋ง, ๋ ์ด์ ์๋ธ ํด๋์ค๋ _do_.
django_tables2.Table.Meta
API๊ฐ ์๊ณ ์ฒซ ๋ฒ์งธ ํ์ ํด๋์ค์์๋ง _starts_ํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ํ ๋น์ ์ ๋๋์ ์ด๋ป์ต๋๊น? Django์ ๋ชจ๋ธ์ ๋ฉํ ์์์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์๊ณ ์์๊ณ ์ฌ๊ธฐ์์ ๋ค๋ฅผ ๊ฒ์ผ๋ก ์์ํฉ๋๊น? ์๋๋ฉด Django์ API์ ์์งํด์ ๊ทธ๋ฅ _๋ง๋__ ๋๋์ ์๋ํ์ต๋๊น?
๋ฐฉ๊ธ ๊ทํ์ ์๋ ๋ฌธ์ ๋ฅผ ๋ค์ ์ฝ์์ผ๋ฉฐ ๊ทํ์ ๋ฌธ์ ๋ ํ์ ํด๋์ค์์ ๋ฉํ ์ต์ ์ ๋ณ๊ฒฝํ๋ ค๊ณ ์๋ํ์ง๋ ์๊ณ ํ์ ํด๋์ค๋ก ๋ถ๋ฅํ๊ณ ์ด์ ์ถ๊ฐํ๋ ค๊ณ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฃ์กํฉ๋๋ค. ๋ง์ํ์ ๋ด์ฉ์ ๋ช ํํ๊ฒ ์ดํดํ์ง ๋ชปํ์ง๋ง, ๋ง์ต๋๋ค. ์ด์จ๋ , ๋๋ Meta์ ๋ํด ๊ฝค ์๋ก์ด ์ ๊ทผ ๋ฐฉ์์ด ์ข์ง ์์ ์ ์์ต๋๋ค.
๋ธ๋๋ค๋ฆฌ,
์ด ํ๋ก์ ํธ์ ์์ ์ ์ฌ๋ํฉ๋๋ค. ๋๋ ์ฌ๊ธฐ์ applegrew์ ๋์ผํ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ผ๋ฉฐ ๊ทํ์ ๋ง์ง๋ง ์๊ฒฌ์ ๋ด ๊ฒฝ์ฐ์ ์๋ฒฝํ๊ฒ ์ผ์นํฉ๋๋ค.
### Table Definitions ###
# parent class
import django_tables2 as tables
# generic parent class to handle table styling
class MyAppTable(tables.Table):
class Meta:
attrs = {'class': 'render-table'}
# subclass in a separate app
from myapp_helpers.tables import MyAppTable
from django_tables2.utils import A
import django_tables2 as tables
class ItemTable(MyAppTable):
address_1 = tables.Column()
address_2 = tables.Column()
address_3 = tables.Column()
city = tables.Column()
state = tables.Column()
zipcode = tables.Column()
# need this to fix a bug with the meta class not passing through to subclasses in django-tables2
class Meta(MyAppTable.Meta):
pass
## Views ##
# class based view in separate app
from django_tables2 import SingleTableView
# Parent class to make pagination the same across views
class MyAppListView(SingleTableView):
# default of 10 rows in every table on every page
table_pagination = {"per_page": 10 }
template_name = 'generic_list.html'
# subclass of view in local app
class ItemListView(MyAppListView):
model = Item
table_class = ItemTable
ItemTable์ ํด๋์ค Meta ์ ์๊ฐ ์์ผ๋ฉด ๋ถ๋ชจ ํด๋์ค์์ ์ค์ ํ ๋ฉํ ์์ฑ์ด ์ ๋ฌ๋์ง ์๋๋ค. ๋ด ์ฑ์ ๋ชจ๋ ํ ์ด๋ธ์ ๋์ผํ ์์ฑ์ ๋ณด๋ด๊ณ ์ถ์ต๋๋ค(๊ฒฐ๊ตญ MyAppTable์์ ์์๋จ).
๋ถ๋ชจ Meta ํด๋์ค(MyAppTable)์์ ์์ํ ItemTable์ ๋น Meta ํด๋์ค๋ฅผ ์ ์ํ๋ ๊ฒ์ ์๋ํ์ง๋ง DRY ์์น์ ์๋ฐฐ๋๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ๋ ์ค์ ๋ถ๊ณผํ๊ณ CSS ํด๋์ค๋ฅผ ํ ์ค๋ก ๋ณ๊ฒฝํ๋ฉด ๋๋ค๋ ์๊ตฌ ์ฌํญ์ ์ฌ์ ํ ์ถฉ์กฑํฉ๋๋ค. ํด์ผ ํฉ๋๋ค. ์ํ์ ๊ฐ์! ๊ฐ์ฌํฉ๋๋ค.
๋๋ ๋น์ ์ด ์ด๋์์ ์๋์ง ์๊ณ ์๊ณ ๋น์ ์๊ฒ ๋์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ฌ์ค ์ด๊ฒ์ ๊ตฌํํ๊ธฐ ์ํด ๋ถ๋ถ์ ์ผ๋ก ํจ์น๋ฅผ ์์ฑํ์ง๋ง ์ด ์ ๊ทผ ๋ฐฉ์์ Django๊ฐ ๋ชจ๋ธ์ ์ทจํ๋ ์ ๊ทผ ๋ฐฉ์๊ณผ ๋ชจ์๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋์ ํ์ฌ ์ ์ฅ์ Django์ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ์๋ํ๋ ๊ฒ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์๋๋ก ์๋ํ๋๋ก ํ๋ ๋ฐ ์ค์ํ๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ฅผ ์ํด Django + Python ํ์ค ๋์์ ๊นจ๋ ๊ฒ์ด ์ ๋ง ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ์ญ๋๊น?
Django/Python์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐํ ์ง ์ฝ ํ ๋ฌ ๋ง์ ํ์ค์ ๊นจ๋ ๊ฒ์ ๋ํ ๋ ผ์์ ํ ์๊ฒฉ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋๋ ๋ช ๊ฐ์ง ์ต์ ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ค์์ ์ํํ ์ ์์ต๋๋ค.
a) ์์ ์์ธํ ์ค๋ช
๋ ๋๋ก ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ฌธ์ํํฉ๋๋ค(์์ง ์๋ ๊ฒฝ์ฐ ๋์ณค์ ์ ์์). ์ ๋ง ๋์ฐํ์ง ์์ต๋๋ค.
b) ํ์ ํด๋์ค๊ฐ ๋ฉํ ์ ๋ณด๋ฅผ ์์ํ ์ ์๋๋ก ํ์ ํด๋์ค์์ ์ฌ์ ์ํ ์ ์๋ 'inherit_meta = False'์ ๊ฐ์ ์์ฑ์ ์ ๊ณตํฉ๋๋ค. Django ํ์ค์ ๋ฐ๋ผ ์์
์ ์ ์งํ๋ ค๋ฉด ๊ธฐ๋ณธ๊ฐ์ด false์ด์ง๋ง ๋์ฒ๋ผ ๋ชจํ์ฌ์ด ๋ง๊ณ ๊ฒ์ผ๋ฅธ ์ฌ๋๋ค์ ๋ฐ๋ณต๋๋ ๋ฉํ ํด๋์ค ์ ์์ ํ์์ฑ์ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋ด๊ฐ ๋ณผ ์์๋ ์ ์ผํ ๋ฌธ์ ๋ ์ ์ฌ์ ์ผ๋ก ๋ฒ๊ทธ (์์ํ์ง ์์ ๋ฐ์ดํฐ๊ฐ ์์) ๋ฑ์ ์ ๋ฐํ ์์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ํด ์ถ๊ฐ ์ฝ๋ ๋ฉ์ด๋ฆฌ๋ฅผ ์ ์ง ๊ด๋ฆฌํ๋ ๊ฒ์
๋๋ค.
c) ์ด ๋์์ ์๋ก์ด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
์ด ๊ธ์ ์ฐ๊ณ ์๋ ์ง๊ธ๋ ๋จธ๋ฆฌ์์๋ ์์์ด ์ผ์ด๋์ง ์๊ณ ํ์์ด ๋ฐ์ํ๋ค๋ ์ฌ์ค์ ๋ฐํ์ผ๋ก ํ ํ๋ฆฟ ๋ณ์๋ฅผ ์ฒดํฌํ๋ ์๋๋ฆฌ์ค๊ฐ ๋์ ๋๋๋ค. ์๋์ผ๋ก ๋์์ ์ฌ์ ์ํ์ต๋๋ค. ๋ํ ๊ธฐ์กด ์์ ์ผ์นํ์ง ์์ต๋๋ค.
์์งํ ๋ ธ๋ ฅํ ๊ฐ์น๊ฐ ์์ ๊ฒ์ ๋๋ค. ๋น์ ํ์ ์ธ ๋์์ ์์ฑํ๊ธฐ ์ํด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฝ๋ฉํ๋ ๊ฒ๋ณด๋ค ๋ฌธ์์์ ๋ฉํ ์์ 'gotcha'์ ๋ํ ์ถ๊ฐ ๋ฉ๋ชจ๋ฅผ ๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ ๊ดํด์๋ ๋ค์๊ณผ ๊ฐ์ด ํฉ๋๋ค.
class Parent(tables.Table):
class Meta:
foo = 1
class Child(Parent):
class Meta(Parent.Meta):
bar = 2
Child.Meta
์๋ ์ด์ foo = 1
_๋ฐ_ bar = 2
๋๋ ์ด๊ฒ์ด ๋ฌธ์๋ก ๊ณ ์น ์ ์๋ค๋ ๋ฐ ๋์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
๊ฐ์ฌ ํด์. ๋๋ ์ค์ ๋ก applegrew์ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ด ์์์ ์ด๊ฒ์ ์ฌ์ฉํ์ต๋๋ค.
์ข์ ์ง์ ์ ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํ ํ ๊ฐ์ง ์ฑ๊ฐ์ฌ์ ๋ถ๋ชจ ํด๋์ค์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ฌ์ ์ํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
class Parent(tables.Table):
class Meta:
attrs = {...}
class Child(Parent):
class Meta(Parent.Meta):
attrs = {'summary': 'A child table'}
์ ๊ธฐ NameError
๊ฐ์ง name 'attrs' is not defined
. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ถ์
ํฉ๋๋ค.
class Child(Parent):
class Meta(Parent.Meta):
pass
Meta.attrs['summary'] = 'A child table'
์ด ๋ฒ๊ทธ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ง ์์ต๋๊น? ์์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์๊ฒ ์ ํฉํ์ง ์์ต๋๋ค. http://stackoverflow.com/questions/21787938/inherit-and-modify-a-meta-class
๋ ๊ฐ์ ์์์ class Meta
๋ฅผ ๋ณํฉํ๋ ๋ช
ํํ ์๊ณ ๋ฆฌ์ฆ์ด ํ์๋์ง ์์ต๋๋ค. attrs
ํค๋ฅผ ์ถ๊ฐํ๊ณ , attrs
์์ ํค๋ฅผ ์ ๊ฑฐํ๊ณ , attrs
๋ฅผ ์ ์ฌ์ ์ผ๋ก ๋ฐ๊พธ๋ ๋ฑ์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ์ด์ฉ๋ฉด ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ๋์น๊ณ ์์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ๋น์ ์ด ์ ์ ์ ์ผ๋ก ์ด๊ฒ์ ์ด๋ป๊ฒ ํ ๊ฒ์ธ์ง ๋์๊ฒ ๋ถ๋ช
ํฉ๋๋ค.
๋์์ models.Model
ํด๋์ค์ ํ์ ํด๋์ค์ธ ๊ฒฝ์ฐ์ ๋์ผํด์ผ ํฉ๋๋ค.
๋๋ ๋น์ ์ด ๋งํ๋ ๊ฒ์ ๋ฐ๋ฅด๊ณ ์๋์ง ํ์ ํ์ง ๋ชปํฉ๋๋ค. ๋ถ๋ชจ ํด๋์ค์์ ๋ฉํ๋ฅผ ์์ํ๊ณ ๋ช ๊ฐ์ ์ด์ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค. ์์ SO ์ง๋ฌธ์์ ์ฝ๋๋ฅผ ์ ๋ฐ์ดํธํ๋๋ฐ ์กฐ๊ธ ๋ ์๋ฏธ๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
@bradleyayers -- ๊ทํ์ ์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๊ณ ์๋ค๋ฉด ์ด StackOverflow ๊ฒ์๋ฌผ ์ ๋ฐ๋ผ Meta๋ฅผ ๋ฎ์ด์ธ ์ ์์ด์ผ ํฉ๋๋ค.
@pydolan ์, ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ๋ํด์๋ http://stackoverflow.com/questions/21787938/inherit-and-modify-a-meta-class ๋ฅผ ํ์ธ