Python django select小部件在我将选择传递给它时不会更新

Python django select小部件在我将选择传递给它时不会更新,python,django-models,django-forms,django-views,Python,Django Models,Django Forms,Django Views,因此,我试图在我的视图中更新一个select小部件作为表单的一部分 我已经看到了很多关于如何做的东西,我已经跟随它,并且几乎达到了目的。 我在下面有一段代码,它被调用来填充select中的选项,但我认为格式已经过时了,因为它会传回一个unicode字符串,我认为它需要是一个元组 分配选择 form.fields['size_option'].widget.attrs['choices'] = Product.get_options(product) def get_options(self):

因此,我试图在我的视图中更新一个select小部件作为表单的一部分

我已经看到了很多关于如何做的东西,我已经跟随它,并且几乎达到了目的。 我在下面有一段代码,它被调用来填充select中的选项,但我认为格式已经过时了,因为它会传回一个unicode字符串,我认为它需要是一个元组

分配选择

form.fields['size_option'].widget.attrs['choices'] = Product.get_options(product)
def get_options(self):
    optionset = "("
    for option in self.optionset.options.all():
        optionset = optionset + "(\'" + option.name + "\', \'" + option.name + "\')"
    optionset = optionset + ")"
    pdb.set_trace()
    return optionset
生成选择的代码

form.fields['size_option'].widget.attrs['choices'] = Product.get_options(product)
def get_options(self):
    optionset = "("
    for option in self.optionset.options.all():
        optionset = optionset + "(\'" + option.name + "\', \'" + option.name + "\')"
    optionset = optionset + ")"
    pdb.set_trace()
    return optionset
为select生成的html如下所示

<select id="id_size_option" name="size_option" choices="((&#39;Small&#39;, &#39;Small&#39;)(&#39;Medium&#39;, &#39;Medium&#39;)(&#39;Large&#39;, &#39;Large&#39;))"> 


因此,问题可能是这个问题被传回了。我也能猜到。我只是不知道有什么问题。我找不到说明如何在select中设置格式的文档。

这应该做什么?选项列表的格式为标准元组:

CHOICES = (
    ('x', 'choice x'),
    ('y', 'choice y'),
)
所以我不明白你想用这些字符串格式做什么

其次,
choices
不是小部件的
attrs
元素,而是字段和/或小部件本身的属性:

form.fields['size_option'].choices = product.get_options()
在任何情况下,您可能希望在此处使用ModelChoiceField,然后可以将
queryset
属性设置为所需的选项列表


最后,您不需要使用
Class.method(instance)
调用实例方法,而是使用
instance.method()
-在您的示例中,
product.get\u options()

为什么要以字符串形式返回optionset…..它必须是中的元组..Daniel,每个产品的元组都不同,因此我需要在显示产品时获取元组。因此,字符串格式是相当随机的。我已经从这一行移到了下一行,而不是那4个def get_options(self):return self.optionset.options.all().values_list('name','name')。然后就像你上面所说的那样简单地修复调用,我正在工作。关于下一个问题;)