我有一个这样的表格:
class MyForm(forms.Form):
[...]
在我的视图中呈现:
if request.method == 'GET':
form = MyForm(request.GET)
现在,我想在select-field中添加一个包含一组值的表单字段,并且必须由当前登录的用户过滤查询集。所以我更改了方法签名,使其包含request-object:
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)])
但是我在渲染表单后得到的是一个对象引用作为字符串而不是select-widget。我似乎一旦声明了表单字段,就无法修改。
有什么想法吗?
答案 0 :(得分:2)
用以下代码替换你的最后一行代码:
self.fields['myfield'].choices = [('%s' % d.id, '%s' % d.name) for d in MyModel.objects.filter(owners = user)]
答案 1 :(得分: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))
假设__unicode__
的{{1}}方法返回MyModel
。
如果此不是的情况,那么您可以继承self.name
并覆盖ModelChoiceField
方法。