2009-07-28 66 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方法。