我正在用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