猿问

渲染带有选择标签的 django_tables2.Column(更新)

我已经编写了一个自定义的可编辑表,其中的django_tables2.Column列子类从,但一直在努力在我的自定义列中呈现选择标记。考虑模型:


我的应用程序/模型.py


from django.db import models

from myapp.utils.enums import MyModelChoices



class MyModel(models.Model):

    bound_model = models.ForeignKey(

        SomeOtherModel,

        related_name='bound_model'

    )


    used_as = models.CharField(

        max_length=50,

        blank=True,

        null=True,

        choices=MyModelChoices.choices()

    )

和myapp/utils/enums.py 中的枚举:


class MyModelChoices:

    __metaclass__ = EnumMeta  # Logic irrelevant


    First = 'First',

    Second = 'Second',

    Third = 'Third'

我最终得到这样的自定义列:


import django_tables2 as tables

from django.forms import ChoiceField


class ChoicesColumn(tables.Column):

    def __init__(self, choices, attrs=None, **extra):

        self.choices = choices

        kwargs = {'orderable': False, 'attrs': attrs}

        kwargs.update(extra)

        super(ChoicesColumn, self).__init__(**kwargs)


    def render(self, value, bound_column):

        select = ChoiceField(choices=self.choices)

        return select.widget.render(

            bound_column.name,

            self.label_to_value(value)

        )


    def label_to_value(self, label):

        for (v, l) in self.choices:

            if l == label:

                return v

后来在我的表类中像这样调用:


import django_tables2 as tables

from myapp.models import MyModel

from myapp.tables.utils import ChoicesColumn


class MyTable(tables.Table):

    name = tables.Column()

    used_as = ChoicesColumn(

        choices=lambda record: record.used_as.choices()

    )


    def render_name(self, record):

        return record.bound_model.name


    class Meta:

        model = MyModel

        fields = ('name', 'used_as',)

但仍然只呈现一个纯<td></td>文本而不是选择字段。在这种情况下我做错了什么?我使用的是 Python 2.7、Django 1.8 和 django-tables2 1.16.0。预先感谢您的建议!


泛舟湖上清波郎朗
浏览 176回答 2
2回答

慕码人2483693

所以,正如我偶然发现的,问题出在accessor属性上——当从used_as&nbsp;=&nbsp;ChoiceColumn(UsedAs.choices(),&nbsp;accessor='used_as')到used_as&nbsp;=&nbsp;ChoiceColumn(UsedAs.choices(),&nbsp;accessor='pk')它终于呈现。我不明白为什么会这样,如果有人向我解释,我将不胜感激。

MM们

有一个更简单的方法:如果您有一个 Enum 列(比如used_as),您可以更改渲染器,使其显示value(而不是name)。将其放在表定义中(在 中class MyTable(tables.Table))。def render_used_as(self,value):&nbsp; &nbsp; v = value.split(".")[1]&nbsp; &nbsp; members = MyModelChoices.__members__&nbsp; &nbsp; return (members[v].value)请注意,我对 Enum 使用了一些不同的语法from enum import EnumClass MyModelChoices(Enum):&nbsp; &nbsp;First = 'First'&nbsp; &nbsp;Second = 'Second'&nbsp; &nbsp;Third = 'Third'注:render_used_as为render_%s与%s =变量名
随时随地看视频慕课网APP

相关分类

Python
我要回答