4

我有一个表单(forms.Form),它会自动为其自己的选择字段生成选择,如下所示:

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 和其他类型的缓存被关闭。

4

2 回答 2

3

从 1.8 版开始提供更好的解决方案:Django 的 ChoiceField能够将 callable 传递给options 。

用作该字段选择的 2 元组的可迭代(例如,列表或元组),或返回此类可迭代的可调用对象。如果参数是可调用的,则每次初始化字段的表单时都会对其进行评估。

所以现在你可以写

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)

您也可以使用ModelChoiceField来完成此任务。

于 2016-04-28T08:51:02.663 回答
2

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

例如

def __init__(self, *args, **kwargs):
    super(UserForm, self).__init__(*args, **kwargs)
    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])

    self.fields['user'].choices = choices
于 2011-05-12T13:47:08.977 回答