为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

泛舟湖上清波郎朗 2021-11-09 16:20:49
我已经编写了一个自定义的可编辑表,其中的django_tables2.Column列子类从,但一直在努力在我的自定义列中呈现选择标记。考虑模型:我的应用程序/模型.pyfrom django.db import modelsfrom myapp.utils.enums import MyModelChoicesclass 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 tablesfrom django.forms import ChoiceFieldclass 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 tablesfrom myapp.models import MyModelfrom myapp.tables.utils import ChoicesColumnclass 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。预先感谢您的建议!
查看完整描述

2 回答

?
慕码人2483693

TA贡献1860条经验 获得超9个赞

所以,正如我偶然发现的,问题出在accessor属性上——当从

used_as = ChoiceColumn(UsedAs.choices(), accessor='used_as')

used_as = ChoiceColumn(UsedAs.choices(), accessor='pk')

它终于呈现。我不明白为什么会这样,如果有人向我解释,我将不胜感激。


查看完整回答
反对 回复 2021-11-09
?
MM们

TA贡献1886条经验 获得超2个赞

有一个更简单的方法:


如果您有一个 Enum 列(比如used_as),您可以更改渲染器,使其显示value(而不是name)。将其放在表定义中(在 中class MyTable(tables.Table))。


def render_used_as(self,value):

    v = value.split(".")[1]

    members = MyModelChoices.__members__

    return (members[v].value)

请注意,我对 Enum 使用了一些不同的语法


from enum import Enum

Class MyModelChoices(Enum):

   First = 'First'

   Second = 'Second'

   Third = 'Third'

注:render_used_as为render_%s与%s =变量名


查看完整回答
反对 回复 2021-11-09
  • 2 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号