Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 动态更新Django表单_Python_Django_Jquery Chosen - Fatal编程技术网

Python 动态更新Django表单

Python 动态更新Django表单,python,django,jquery-chosen,Python,Django,Jquery Chosen,我有一个简单的表单,它提供了django模型中所有可用条目的下拉菜单 forms.py class SampleNameLookupForm(forms.Form): #Make a list of sample name options for dropdown menu. # Turn that into a list of tuples for ChoiceField. samples = Sample.objects.all() sample_list =

我有一个简单的表单,它提供了django模型中所有可用条目的下拉菜单

forms.py

class SampleNameLookupForm(forms.Form):
    #Make a list of sample name options for dropdown menu.
    # Turn that into a list of tuples for ChoiceField.
    samples = Sample.objects.all()
    sample_list = [i.sample_name for i in samples]
    sample_tuple = [(i, i) for i in sample_list]
    Sample_Name = chosenforms.ChosenChoiceField(sample_tuple)
models.py

class Sample(models.Model):
    sample_ID = models.CharField(max_length=20)
    sample_name = models.CharField(max_length=30)

    def __unicode__(self):
        return self.sample_ID

    class Meta:
        ordering = ['id']
当我向模型添加一个新示例时,我可以在mysql或python manage.py shell中访问模型时看到新添加的示例,但它不会出现在Selected field下拉菜单中

当我重新启动服务器时,表单会在下拉菜单中反映新的示例。如何在不重新启动服务器的情况下更新下拉菜单


我应该提到的是,我只是在本地托管,目前还没有投入生产。

代码需要在表单的
\uuuu init\uuuu>方法中,而不是直接在类体中,因为方法是在每个表单实例上计算的,而不是仅在定义类时计算的

class SampleNameLookupForm(forms.Form):
    def __init__(self):
        #Make a list of sample name options for dropdown menu.
        # Turn that into a list of tuples for ChoiceField.
        samples = Sample.objects.all().values_list('sample_name', flat=True)
        sample_tuple = [(i, i) for i in samples]
        self.fields['Sample_Name'] = chosenforms.ChosenChoiceField(sample_tuple)

另外请注意,我不知道什么是
ChosenChoiceField
,但标准Django表单库有一个
modelcooicefield
,专门用于此用途;它采用了一个
queryset
参数,该参数是惰性计算的,因此不需要
\uuuuu init\uuuuuu
之类的东西。

您应该将该代码放在表单的
\uuuuuu init\uuuuuu
方法中,而不是直接放在类主体中。您介意提供一个示例吗?当我尝试这个的时候,我似乎犯了一些错误。在下拉菜单中添加了更多的功能。好的,如果您使用的是django Selected,那么您应该使用
ChosenModelChoiceField
,它做了同样的事情,并且再次避免了对
\uuuuu init\uuuuu
进行过多的操作。是的,我对所有其他表单都使用此选项,但是我不知道如何为这个特殊的表单soince Sample.objects.all()建立正确的查询集,它不会给我样本名称,而是Sample IDNo,Sample.objects.all()给你样本对象本身。ModelChoiceField使用id和unicode表示来生成字段。那么如何访问提供示例名称列表的queryset呢?