我已经编写了一个自定义的可编辑表,其中的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')
它终于呈现。我不明白为什么会这样,如果有人向我解释,我将不胜感激。

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 =变量名
添加回答
举报
0/150
提交
取消