Django表重新加载数据

Jib*_*bin 7 forms django caching

我有一个将数据输入db的表单.我有另一个带有下拉字段的表单,它使用第一个表单输入的数据.

因此,当我从第一个表单提交数据时,db会正确更新.但是当我加载第二个表单时,下拉列表不会使用最新数据进行更新.

调试步骤如下

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

问题不在于视图缓存(因为我们没有任何缓存中间件)我也尝试过像@ 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.'})
Run Code Online (Sandbox Code Playgroud)

第二页

形成

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'})    
Run Code Online (Sandbox Code Playgroud)

询问

def getOrgUnitList():
    orgUnitList = list(OrganizationUnit.objects.values_list('OrgUnitID','OrgUnitName').order_by('OrgUnitName'))
    return orgUnitList
Run Code Online (Sandbox Code Playgroud)

编辑

如果我使用modelforms,一切都很好.为什么呢?

Dan*_*man 6

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

解决这个问题getOrgUnitList__init__一种方法是在窗体的方法中调用函数:

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

或者,您应该考虑使用ModelChoiceFieldorgUnit,因为它会自动处理这类事情.