Django-tables2: Opsi meta tidak diwariskan.

Dibuat pada 15 Jul 2012  ·  17Komentar  ·  Sumber: jieter/django-tables2

Hai,

Saya memiliki tabel berikut

    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')

Ketika saya merender RoomTable yang dihasilkan <table> tidak memiliki atribut class . Saya bisa mendapatkan atribut itu hanya ketika saya memindahkan (atau menyalin) kelas Meta dari BaseTable ke RoomTable .

Apakah ini bug atau saya salah menggunakannya?

docs

Semua 17 komentar

Terima kasih atas laporannya, ini adalah bug. Sekarang ada di bagian atas daftar tugas saya.

Terima kasih.

Jadi saya hampir selesai mengimplementasikan solusi untuk ini, dan kemudian saya ingat bahwa untuk warisan Meta saya mengikuti gaya Django, yaitu

class Meta(Parent.Meta):
    ...

Jadi sekarang saya mulai bertanya-tanya apakah sebenarnya ide yang bagus untuk menyimpang dari itu. Saya kira itu selalu tidak konsisten, di subkelas pertama dari django_tables2.Table Anda _tidak_ perlu melakukan class Meta(django_tables2.Tables): , tetapi untuk subkelas selanjutnya Anda _do_.

Saya kira Anda bisa mengatakan bahwa tidak ada django_tables2.Table.Meta API, dan hanya _starts_ pada subclass pertama. Apa perasaan Anda tentang ini? Tahukah Anda bagaimana pewarisan Meta model Django bekerja dan mengharapkannya berbeda di sini? Atau apakah Anda naif terhadap API Django dan Anda baru saja mencoba apa yang terasa _benar_?

Saya baru saja membaca kembali masalah asli Anda, dan masalah Anda tampaknya adalah Anda bahkan tidak mencoba mengubah opsi meta di subkelas Anda, Anda hanya mencoba membuat subkelas dan menambahkan kolom.

Maaf saya tidak mengerti dengan jelas apa yang Anda katakan, tapi ya apa yang saya lakukan adalah yang terasa benar. Bagaimanapun, saya cukup baru dalam hal Meta sehingga pendekatan saya mungkin tidak baik.

Bradley,

Cintai pekerjaan di proyek ini. Saya mengalami masalah yang sama dengan applegrew di sini, dan komentar terakhir Anda sangat cocok dengan kasus saya.

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

Jika definisi Meta kelas tidak ditempatkan di ItemTable, atribut meta yang ditetapkan di kelas induk tidak dikirim. Saya ingin attrs yang sama dikirim ke semua tabel di aplikasi saya (yang pada akhirnya mewarisi dari MyAppTable)

Mendefinisikan kelas Meta kosong di ItemTable yang mewarisi dari kelas Meta induk (MyAppTable) berfungsi, tetapi tampaknya bekerja melawan prinsip KERING, meskipun hanya dua baris dan masih memenuhi persyaratan saya hanya perlu mengubah kelas CSS dalam satu tempat yang harus saya perlukan. Hargai karya! Terima kasih.

Saya tahu dari mana Anda berasal, dan saya cenderung setuju dengan Anda, pada kenyataannya saya telah menulis sebagian tambalan untuk mengimplementasikan ini, namun pendekatan ini bertentangan dengan pendekatan yang diambil Django dengan model. Namun pendirian saya saat ini adalah bahwa membuat sesuatu bekerja dengan cara yang mirip dengan Django adalah penting untuk membuat perpustakaan bekerja seperti yang diharapkan.

Apakah menurut Anda itu benar-benar layak untuk dihentikan dari perilaku standar Django + Python untuk ini?

Karena hanya mengembangkan menggunakan Django/Python selama sekitar satu bulan, saya rasa saya tidak memenuhi syarat untuk membuat argumen untuk melanggar norma. Saya kira ada beberapa pilihan sekalipun. Anda bisa:

a) Dokumentasikan solusi seperti yang dijelaskan di atas (jika belum, saya mungkin melewatkannya). Ini benar-benar tidak mengerikan.
b) Berikan atribut seperti 'inherit_meta = False' yang dapat diganti di subkelas untuk memungkinkan subkelas mewarisi informasi meta. Defaultnya adalah false untuk menjaga segala sesuatunya bekerja menurut standar Django, tetapi akan memungkinkan lebih banyak orang yang suka berpetualang/malas seperti saya untuk menghilangkan kebutuhan akan definisi kelas Meta yang berulang. Satu-satunya masalah yang saya lihat adalah mempertahankan potongan kode tambahan untuk solusi yang berpotensi menimbulkan bug (data ada saat tidak diharapkan), dll.
c) Jadikan perilaku ini sebagai default baru.

Bahkan saat saya menulis ini, saya sudah bisa melihat skenario di kepala saya di mana variabel templat diperiksa berdasarkan fakta bahwa pewarisan tidak terjadi, kerusakan terjadi, dan saya menghabiskan berjam-jam mengaduk-aduk kode hanya untuk mengetahui bahwa itu rusak karena saya mengesampingkan perilaku secara manual. Itu juga tidak akan cocok dengan contoh yang ada.

Terus terang, itu mungkin tidak sepadan dengan usaha. Saya lebih suka melihat catatan tambahan tentang pewarisan meta 'gotcha' dalam dokumentasi daripada mencoba membuat kode dalam solusi untuk menghasilkan perilaku atipikal.

Sehubungan dengan a), Anda melakukannya seperti ini:

class Parent(tables.Table):
    class Meta:
        foo = 1

class Child(Parent):
    class Meta(Parent.Meta):
        bar = 2

Child.Meta sekarang memiliki foo = 1 _dan_ bar = 2

Saya cenderung setuju bahwa ini dapat diperbaiki dengan dokumentasi.

Terima kasih. Saya sebenarnya memiliki ini dalam contoh saya berdasarkan contoh applegrew.

Doh, poin yang bagus.

Satu gangguan dengan penyelesaiannya adalah Anda tidak dapat menimpa sesuatu di kelas Induk:

class Parent(tables.Table):
    class Meta:
        attrs = {...}

class Child(Parent):
    class Meta(Parent.Meta):
         attrs = {'summary': 'A child table'}

memunculkan NameError dengan name 'attrs' is not defined . Namun, ini tampaknya berhasil, tetapi jelek:

class Child(Parent):
    class Meta(Parent.Meta):
        pass
     Meta.attrs['summary'] = 'A child table'

Apakah ada solusi untuk bug ini belum? Solusi di atas tidak bekerja untuk saya. http://stackoverflow.com/questions/21787938/inherit-and-modify-a-meta-class

Saya tidak melihat algoritma yang jelas untuk menggabungkan dua class Meta arbitrer. Pikirkan tentang kasus untuk menambahkan kunci ke attrs , menghapus kunci dari attrs , mengganti attrs dengan dict baru, dll. Mungkin saya kehilangan sesuatu tetapi tidak jelas bagi saya bagaimana Anda akan melakukan ini dengan cara yang waras.

Perilakunya harus sama seperti jika Anda adalah kelas subkelas models.Model .

Saya tidak yakin saya mengikuti apa yang Anda katakan. Saya hanya mencoba mewarisi meta dari kelas induk dan menambahkan beberapa kolom. Saya telah memperbarui kode dalam pertanyaan SO di atas, yang semoga sedikit lebih masuk akal.

@bradleyayers - jika saya memahami permintaan Anda dengan benar, Anda harus dapat mengikuti posting StackOverflow ini untuk menimpa Meta

@pydolan Ya, periksa http://stackoverflow.com/questions/21787938/inherit-and-modify-a-meta-class untuk beberapa pendekatan lain juga.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat