【问题标题】:Updating Django Forms Dynamically动态更新 Django 表单
【发布时间】:2015-08-19 18:22:49
【问题描述】:

我有一个简单的表单,它提供了 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 中访问模型时可以看到新添加的内容,但它没有出现在所选字段下拉菜单中。

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

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

【问题讨论】:

  • 您应该将该代码放在表单的__init__ 方法中,而不是直接放在类主体中。
  • 您介意提供一个例子吗?当我尝试这个时,我似乎遇到了一些错误。

标签: python django jquery-chosen


【解决方案1】:

代码需要在表单的__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__ 东西。

【讨论】:

  • chosen 为下拉菜单添加了更多功能。
  • 好的,如果你使用 django-chosen,你应该使用 ChosenModelChoiceField,它做同样的事情,并且再次避免了对 __init__ 的过多处理。
  • 是的,我对所有其他表单都使用了这个选项,但我不知道如何为这个特定表单建立正确的查询集,因为 Sample.objects.all() 不会给我样本名称,而是样本 ID
  • 不,Sample.objects.all() 为您提供 Sample 对象本身。 ModelChoiceField 使用 id 和 unicode 表示来生成字段。
  • 那么我如何访问提供样本名称列表的查询集?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
相关资源
最近更新 更多