首页 > 解决方案 > 管理与 Python 函数相对应的 Django UI 选择的最可扩展的方法是什么?

问题描述

我正在尝试创建一个静态共享函数列表及其描述以显示在Django form MultipleChoiceField.

我希望它是可扩展的,以防我稍后添加更多文件选项,但除了编写新函数并将其添加到我的tasks.py文件中的CHOICES列表之外,我不想在多个地方更改代码。

我似乎无法从课堂外的列表中引用函数( abc) 。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:'
    )

标签: pythondjangoformsdjango-formsextensibility

解决方案


在字符串值和函数名之间添加一个映射层:

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

推荐阅读