Django表单.form返回空选择列表

agxfikkp  于 2023-01-18  发布在  Go
关注(0)|答案(1)|浏览(102)

我通过init方法为给定的forms.form添加了选择,如下所示:

def __init__(self, user, instance=None, *args, **kwargs):
        super(ProductColorVariationsForm, self).__init__(*args, **kwargs)
        self.fields["photo"].required = False
        files =  ()
        for file in instance.files.all():
            files = files + ((file.id, file.file.url),)
        self.fields['photo'].choices = files

在模板中,我得到了预期的选择列表项。

但是,我无法验证表单,因为它抱怨所选的值不在可用的选择中。
打印定制小部件中的选项,得到一个空元组。

class JQSelectMenuInputWidget(Select):
    template_name = "widgets/jqselectmenu.html"
    def __init__(self, attrs=None, choices=(), disabled_choices=()):
        super(JQSelectMenuInputWidget, self).__init__(attrs, choices=choices)
        self.disabled_choices = disabled_choices
        print(choices)

所以我的问题是,为什么在init方法中设置的选项没有传递给小部件类。

fafcakar

fafcakar1#

您不是在使用小部件,而是在使用表单字段,您使用.widget来访问小部件:

def __init__(self, user, instance=None, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields['photo'].required = False
    if instance.files:
        self.fields['photo'].widget.choices = [
            (file.id, file.file.url) for file in instance.files.all()
        ]

注意:从PEP-3135 [pep]开始,如果第一个参数是在其中定义方法的类,第二个是函数的第一个参数(通常是self),则不需要使用参数调用super(…)

相关问题