2009-07-28 29 views
0

我有一個這樣的形式:用戶在表單級

class MyForm(forms.Form): 
[...] 

這在我看來是呈現:

if request.method == 'GET': 
    form = MyForm(request.GET) 

現在,我想添加其中包含了一組表單域值在選擇字段中,並且查詢集必須由當前登錄的用戶過濾。所以我改變了方法簽名,以便它包含請求對象:

class MyForm(forms.Form): 
    def __init__(self, user, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.myfield = forms.ChoiceField([('%s' % d.id, '%s' % d.name) for d in MyModel.objects.filter(owners = user)]) 

但所有呈現形式後我得到的是一個對象的引用作爲字符串而不是選擇窗口小部件。我似乎已經聲明一個表單字段不能被修改。

任何想法?

回答

2

這種替換的代碼的最後一行:

self.fields['myfield'].choices = [('%s' % d.id, '%s' % d.name) for d in MyModel.objects.filter(owners = user)] 
0

我覺得這裏就是你以後:

class MyForm(forms.Form): 
    def __init__(self, user, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['myfield'] = forms.ModelChoiceField(MyModel.objects.filter(owners=user)) 

這是假設你MyModel回報self.name__unicode__方法。 如果這個不是的情況下,那麼你可以子類ModelChoiceField並覆蓋label_from_instance方法。