2015-08-19 146 views
0

我有一個簡單的表單,它提供了django模型中所有可用條目的下拉菜單。動態更新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,但它不會出現在所選字段的下拉菜單中。

當我重新啓動服務器時,表單會在下拉菜單中反映新樣本。如何在不重新啓動服務器的情況下更新下拉菜單?

我應該提到我只是在本地託管,目前還沒有投入生產。

+0

您應該將該代碼放在窗體的'__init__'方法中,而不是直接放在類體中。 –

+0

你介意提供一個例子嗎?我嘗試這個時似乎遇到了一些錯誤。 – Malonge

回答

2

該代碼需要位於表單的__init__方法中,而不是直接在類體中,因爲該方法是在每個表單瞬時化上評估的,而不是僅在定義該類時進行評估。

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表單庫已被用於這種用途專門用於一個ModelChoiceField;它需要延遲評估的queryset參數,並因此避免了需要__init__的東西。

+0

[selected](https://harvesthq.github.io/chosen/)爲下拉菜單增加了一些功能。 – Malonge

+0

好的,如果您使用的是django選擇的,您應該使用'ChosenModelChoiceField',它可以做同樣的事情,並且可以避免使用'__init__'。 –

+0

是的,我使用這個選項爲我所有的其他形式,但我不知道如何建立適當的查詢設置爲這個特殊的形式,因此Sample.objects.all()不會給我的樣本名稱,而是樣本ID – Malonge