Django形成了自动生成的选择域

时间:2011-05-12 13:40:19

标签: django forms choicefield

我有一个表单(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上的dev服务器或远程服务器上的apache之前,新条目不会显示。

这段代码什么时候评估?我怎样才能使它每次重新计算条目

PS。 memchached和其他种类的缓存都被关闭了。

2 个答案:

答案 0 :(得分:2)

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

e.g。

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

答案 1 :(得分:1)

从版本1.8开始提供了更好的解决方案:Django的ChoiceField有ability to pass a callable to choices

  

要使用的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执行此任务。