Django forms choicefield自动生成的选项

Django forms choicefield自动生成的选项,django,forms,choicefield,Django,Forms,Choicefield,我有一个表单(forms.form),它自动为自己的choicefield生成选项,如下所示: class UserForm(forms.Form): def generate_choices(): from vn.account.models import UserProfile up = UserProfile.objects.filter(user__isnull=True) choices = [('0','--')]

我有一个表单(forms.form),它自动为自己的choicefield生成选项,如下所示:

class UserForm(forms.Form):
    def generate_choices():
        from vn.account.models import UserProfile
        up = UserProfile.objects.filter(user__isnull=True)
        choices = [('0','--')]
        choices += ([(s.id ,'%s %s (%s), username: %s, email: %s' % (s.first_name, s.last_name, s.company_name, s.username, s.email)) for s in up])
        return choices

    user = forms.ChoiceField(label=_('Select from interest form'), choices=generate_choices())
我的问题是,它显示为一个选择框(正如预期的那样),但其内容以某种方式被缓存。在我重新启动本地pc上的开发服务器或远程服务器上的apache之前,不会显示新条目

那段代码什么时候计算?如何使其每次都重新计算条目


PS.memchached和其他类型的缓存被关闭。

我认为您需要通过init执行此操作,以便在调用表单时对其进行求值,例如

e、 g


从1.8版开始,有一个更好的解决方案可用:Django的ChoiceField已经发布

2元组的iterable(如列表或元组)用作 此字段的选项,或返回此iterable的callable。 如果参数是可调用的,则每个 初始化字段表单的时间

现在你可以写了

class UserForm(forms.Form):
    def generate_choices():
        from vn.account.models import UserProfile
        up = UserProfile.objects.filter(user__isnull=True)
        choices = [('0','--')]
        choices += ([(s.id ,'%s %s (%s), username: %s, email: %s' % (s.first_name, s.last_name, s.company_name, s.username, s.email)) for s in up])
        return choices

    user = forms.ChoiceField(label=_('Select from interest form'), choices=generate_choices)
您也可以使用此任务

class UserForm(forms.Form):
    def generate_choices():
        from vn.account.models import UserProfile
        up = UserProfile.objects.filter(user__isnull=True)
        choices = [('0','--')]
        choices += ([(s.id ,'%s %s (%s), username: %s, email: %s' % (s.first_name, s.last_name, s.company_name, s.username, s.email)) for s in up])
        return choices

    user = forms.ChoiceField(label=_('Select from interest form'), choices=generate_choices)