我有一个表单(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和其他种类的缓存都被关闭了。
答案 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执行此任务。