Django 非常奇怪地生成表单的下拉列表

Django generates form's dropdown very oddly

我有这个带有选项的下拉菜单,它的选项是基于枚举的,表单是在 admin 上生成的,但是其中 2 个选项有一个奇怪的值并且用括号括起来,我一直在使用这样的下拉菜单,它是第一次发生这种情况,知道为什么会这样吗?谢谢

我的枚举:

class ProjectPublicState(object):
    OPEN_FOR_APPLICATIONS = 1
    IN_PROGRESS = 2
    CLOSED = 3,
    NOT_PUBLIC = 4,

    @classmethod
    def default(cls):
        return cls.OPEN_FOR_APPLICATIONS 

在我的模型中:

PUBLIC_STATE_CHOICES = (
        (ProjectPublicState.OPEN_FOR_APPLICATIONS, _('Open for Applications')),
        (ProjectPublicState.IN_PROGRESS, _('In Progress')),
        (ProjectPublicState.CLOSED, _('Closed')),
        (ProjectPublicState.NOT_PUBLIC, _('Not Public')),
    )

并且(将其更改为 models.IntegerField 也没有解决)

 state_public = FSMIntegerField(
        _('Public State'),
        choices=PUBLIC_STATE_CHOICES,
        default=ProjectPublicState.default()
    )

结果:

<select name="state_public" id="id_state_public" class="form-control">
<option selected="selected" value="1">Open for Applications</option>
<option value="2">In Progress</option>
<option value="(3,)">Closed</option>
<option value="(4,)">Not Public</option>
</select>

这是因为你不小心把变量CLOSEDNOT_PUBLIC转换成了tuples,在末尾加了一个逗号。

根据 Python tuples:

上的文档

A tuple consists of a number of values separated by commas.

您应该删除末尾的逗号,它应该可以正常工作。

class ProjectPublicState(object):
    OPEN_FOR_APPLICATIONS = 1
    IN_PROGRESS = 2
    CLOSED = 3 # remove the trailing comma
    NOT_PUBLIC = 4 # remove the trailing comma

    @classmethod
    def default(cls):
        return cls.OPEN_FOR_APPLICATIONS 

例如:

In [1]: foo = 1, # assign 'foo' as 1 with a trailing comma at the end

In [2]: foo # print foo
Out[2]: (1,) # a tuple and not just a number 

In [3]: foo = 1,2,3 # Now assign multiple values separated by commas

In [4]: foo
Out[4]: (1, 2, 3) # tuple of 3 elements