python - 管理与 Python 函数相对应的 Django UI 选择的最可扩展的方法是什么?
问题描述
我正在尝试创建一个静态共享函数列表及其描述以显示在Django
form
MultipleChoiceField
.
我希望它是可扩展的,以防我稍后添加更多文件选项,但除了编写新函数并将其添加到我的tasks.py文件中的CHOICES
列表之外,我不想在多个地方更改代码。
我似乎无法从课堂外的列表中引用函数( a
、b
和c
) 。CHOICES
我已经TaskClass.a
在列表中尝试过,但我不断收到错误消息:
Unresolved reference 'a'
最好的方法是什么?
任务.py
CHOICES = [
('This is function A.', a),
('This is function B.', b),
('This is function C.', c)
]
class TaskClass():
def a(self):
...
def b(self):
...
def c(self):
...
表格.py
from tasks import CHOICES
class MyForm(forms.Form):
function_choices = []
# Convert function choices to list format needed for MultipleChoiceField
for i, tuple in enumerate(CHOICES):
function_choices.append((i+1, tuple[0]))
forms.MultipleChoiceField(
choices=function_choices,
widget=forms.CheckboxSelectMultiple,
label='Functions to Call:'
)
解决方案
在字符串值和函数名之间添加一个映射层:
CHOICES = [
('a', 'This is function A.'),
('b', 'This is function B.'),
('c', 'This is function C.'),
]
class TaskClass(object):
def __init__(self):
self.task_map = {
'a': self.a,
'b': self.b,
'c': self.c
}
def a(self):
...
def b(self):
...
def c(self):
...
然后你可以通过调用来运行适当的函数:
tc = TaskClass()
tc.task_map['a']()
推荐阅读
- django - Django - “check_token”总是返回 TRUE
- joomla - 如何在 Joomla Community Builder 上使用无效日期输入不保存编辑个人资料
- python - 是否可以从 1inch API 获取加密货币历史价格?
- php - 使用产品表插件在产品名称 WooCommerce 下显示产品标签
- python - 如何从列表列表中找到共同元素以保持出现顺序?
- java - 我们可以使用 Bouncy Castle 动态存储和使用这 5 个 CRT 文件吗
- php - 当请求来自外部 API 时,无法访问 Laravel 中的 cookie
- api - 谷歌安全浏览 API 不返回威胁 URL
- linux - SQLCipher:QT中使用sqlcipher的问题
- javascript - 如何基于clientX mousemove制作一个div scrollLeft