Python 动态更新Django表单
我有一个简单的表单,它提供了django模型中所有可用条目的下拉菜单 forms.pyPython 动态更新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 =
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呢?