首页 文章

Django ModelChoiceField:过滤查询集并将默认值设置为对象

提问于
浏览
54

我在 Models 中定义了一个Django Form类:

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

这工作正常,但它有一些限制我似乎无法解决:

(1)我想在查询集上使用过滤器,基于传递给表单的变量 accountid ,如下所示:

User.objects.filter(account=accountid)

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

因此, queryset 必须以某种方式在 Views 中定义,但据我所知,它是Form类中的必填字段 .

(2)我想在数据库中默认选择 AccountDetailsForm 一个对象,我可以在_2778150中选择,如下所示:

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

我已经尝试将adminuser指定为表单中的默认值(适用于其他标准表单字段,如 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})

但没有运气 .

鉴于我在这里需要的灵活性,我应该使用除_2778154之外的其他东西吗?

谢谢 .

3 回答

  • 6

    覆盖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'})
    
  • 99

    您可以覆盖视图中的字段

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

    在Django 2.0中,您可以将对象(在您的情况下为 User )从 view 传递到 form (您必须先从数据库中检索obj):

    form = AccountDetailsForm(initial={'adminuser': adminuser})
    

    它将为您提供默认选定对象(回答您的2)问题)

相关问题