【问题标题】:What is the most extensible way to manage Django UI choices that correspond to Python functions?管理与 Python 函数相对应的 Django UI 选择的最可扩展的方法是什么?
【发布时间】:2018-08-13 15:48:04
【问题描述】:

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

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

我似乎无法在课堂外引用我的CHOICES 列表中的函数(abc)。我在列表中尝试了TaskClass.a,但我一直收到错误:

Unresolved reference 'a'

最好的方法是什么?

tasks.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):
        ...

form.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:'
    )

【问题讨论】:

    标签: python django forms django-forms extensibility


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-02
      • 2020-08-18
      • 1970-01-01
      • 2012-07-17
      • 2020-02-13
      • 2012-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-18
      相关资源
      最近更新 更多