我正在用django构建我的第一个表单,而且我看到了一些我根本没有想到的行为。使用django的Form类是否保持状态?
class AssignmentFilterForm(forms.Form):
filters = []
filter = forms.ChoiceField()
def __init__(self, *args, **kwargs):
super(forms.Form, self).__init__(*args, **kwargs)
self.filters.append(PatientFilter('All'))
self.filters.append(PatientFilter('Assigned', 'service__isnull', False))
self.filters.append(PatientFilter('Unassigned', 'service__isnull', True))
for i, f in enumerate(self.filters):
self.fields["filter"].choices.append((i, f.name))
当我输出此表单模板:
{{ form.as_p }}
我看到正确的选择,我定义了一个表单类。但是,刷新页面后,我在选择框中看到列表三次。再次点击刷新会在列表中显示10次!
这是我的观点:
@login_required
def assign_test(request):
pg = PhysicianGroup.objects.get(pk=physician_group)
if request.method == 'POST':
form = AssignmentFilterForm(request.POST)
if form.is_valid():
yes = False
else:
form = AssignmentFilterForm()
patients = pg.allPatients().order_by('bed__room__unit', 'bed__room__order', 'bed__order')
return render_to_response('hospitalists/assign_test.html', RequestContext(request, {'patients': patients, 'form': form,}))
我在做什么错?
谢谢,皮特
哈哈,谢谢。新的语言。同样的问题发生,因为过滤器也是静态的。我如何解决它? – slypete 2009-08-13 22:52:09
在'__init__'循环之前,先执行'self.fields ['filter']。choices = []'来清理你之前从“上一轮”得到的内容。可能不是固有的线程安全,所以如果你是多线程的话,你需要谨慎,但线程对于语言初学者来说是一个雷区,所以如果你能避免它,你会变得更加快乐。 – 2009-08-13 23:00:04
大声笑,我不是初学者,只是为了这种语言。我如何使过滤器实例var?我现在很困惑为什么Django的表单文档使用静态变量。 – slypete 2009-08-13 23:07:46