2011-03-16 56 views
48

我有一个Django表单类中定义喜欢这ModelsDjango的ModelChoiceField:过滤查询设置和设置默认值作为对象

class AccountDetailsForm(forms.Form): 
    ... 
    adminuser = forms.ModelChoiceField(queryset=User.objects.all()) 

该工程确定,但它有一些局限性,所以我似乎无法解决:

(1)I想用的查询集的过滤器,基于传递给形式的可变accountid,像这样:

User.objects.filter(account=accountid) 

这在模型中不起作用,因为accountid当然不能作为变量传递。

由此可见,queryset必须以某种方式在Views定义,但据我可以看到它在Form类必填字段。

(2)我想提出的AccountDetailsForm在数据库中的对象,我可以在Views这样选择默认的选择:

User.objects.filter(account=accountid).filter(primary_user=1) 

我已经试过指定管理用户的默认形式值,(这与其他标准的表单字段的作品,像CharField):

adminuser = User.objects.filter(account=accountid).filter(primary_user=1) 

... 

form = AccountDetailsForm({'adminuser': adminuser}) 
return render_to_response('accounts/edit/accountdetails.html', 
{'form': form, 'account':account}) 

,但没有运气。

鉴于我需要的灵活性,我是否应该使用ModelChoiceField以外的东西?

谢谢。

回答

91

覆盖init方法并接受一个新的关键字参数

class AccountDetailsForm(forms.Form): 
    ... 
    adminuser = forms.ModelChoiceField(queryset=User.objects.all()) 
    def __init__(self, *args, **kwargs): 
     accountid = kwargs.pop('accountid', None) 
     super(AccountDetailsForm, self).__init__(*args, **kwargs) 

     if accountid: 
      self.fields['adminuser'].queryset = User.objects.filter(account=accountid) 

form = AccountDetailsForm(accountid=3) 

你可以随时手动设置选择在视图中。

form = AccountDetailsForm() 
form.fields['adminuser'].queryset = User.objects.filter(account=accountid) 

被警告:你是在一本字典传递给一个形式就像你的榜样设置的默认值。

您实际上正在创建一个绑定表单,可能触发验证以及所有爵士乐。

设置默认值,use the initials argument.

form = AccountDetailsForm(initial={'adminuser':'3'}) 
+0

嗨场,感谢您的回复。在视图中设置查询集运行良好。我无法解决的部分是将ModelChoiceField的绑定表单值(而不是默认值)设置为_User.objects.filter(account = accountid).filter(primary_user = 1)_。谢谢。 – eli 2011-03-16 18:52:42

6

您可以覆盖在视图

yourForm = AccountDetailsForm() 

yourForm.fields['accomodation'] = forms.ModelChoiceField(User.objects.filter(account=accountid).filter(primary_user=1))