【问题标题】:Django Form reload dataDjango 表单重新加载数据
【发布时间】:2012-01-19 02:49:21
【问题描述】:

我有一个向数据库输入数据的表单。 我有另一个带有下拉字段的表单,它使用第一个表单输入的数据。

所以当我从第一个表单提交数据时,数据库会正确更新。 但是当我加载第二个表单时,下拉列表不会更新为最新数据。

调试步骤

问题不在于事务/提交等。 检索第二种形式的下拉菜单数据的查询是正确的。

问题也不在于视图缓存(因为我们没有任何缓存中间件) 我还尝试了缓存装饰器,如@never_cahce、@cache_control 等

我尝试以第二种形式给出打印声明。 我相信问题出在表单缓存上。 每个 django 表单只加载一次,即。在加载网站的第一页时。 然后从这个缓存中加载表单。

首页

表格

class AddOrganization(forms.Form):   

    orgList = getOrgUnitList()     

    orgUnit = forms.CharField(label=u'Organization Name',
                                max_length=50,
                                error_messages={'required':'Organization name is required field.'})

    parentOrg= forms.ChoiceField(label=u'Parent Organization',
                           choices=[(u'Select',u'Select')]+orgList,
                           error_messages={'required':'Organization name is required field.'})

第二页

表格

class AddUser(forms.Form):    

    orgUnitList = getOrgUnitList()        

    email = forms.EmailField(label=u'Email',
                             max_length=50,
                             error_messages={'required':'Email is required field'})  

    orgUnit = forms.ChoiceField(label=u'Organizational Unit',   
                      choices=orgUnitList,                        
                                error_messages={'required':'Organizational unit is required field'})    

查询

def getOrgUnitList():
    orgUnitList = list(OrganizationUnit.objects.values_list('OrgUnitID','OrgUnitName').order_by('OrgUnitName'))
    return orgUnitList

编辑

如果我使用 modelforms,一切都很好。为什么会这样?

【问题讨论】:

  • 你能给我们看一些代码示例吗?注:您必须从第一个表单中重新加载/获取数据库中的数据,您需要在第二个表单的下拉列表中显示这些数据。
  • 我们只是凡人 - 请提供实际代码,否则我们只是在猜测问题。这个查询到底在哪里?你确定它正在被执行吗?即使您是肯定的,也请向我们展示!

标签: django forms caching


【解决方案1】:

问题是orgUnitList 声明为表单中的类属性。这意味着它在最初定义表单时被调用一次。因此,在重新启动服务器进程之前,不会看到新元素。

解决此问题的一种方法是在表单的__init__ 方法中调用getOrgUnitList 函数:

class AddOrganization(forms.Form):
    ...
    def __init__(self, *args, **kwargs):
        super(AddOrganizationForm, self).__init__(*args, **kwargs)
        self.fields['orgUnit'].choices = getOrgUnitList()

或者,您应该考虑将 ModelChoiceField 用于 orgUnit,因为它会自动处理此类事情。

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多