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


    我有一个Django Form类定义喜欢这个在Models:
    class AccountDetailsForm(forms.Form):
        ...
        adminuser = forms.ModelChoiceField(queryset=User.objects.all())

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

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

    User.objects.filter(account=accountid)

    这不能在模型中工作,因为accountid不能作为一个变量传递,当然。

    因此,查询集必须以某种方式在视图中定义,但就我可以看到它是一个必需的字段在Form类。

    (2)我想默认选择AccountDetailsForm数据库中的一个对象,我可以在视图中选择这样:

    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})

    但没有运气。

    我应该使用除ModelChoiceField之外的其他方式给我这里需要的灵活性吗?

    谢谢。

     
    覆盖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'})
    翻译自:https://stackoverflow.com/questions/5329586/django-modelchoicefield-filtering-query-set-and-setting-default-value-as-an-obj
  • 相关阅读:
    关于面向对象和面象过程的一些感想
    面向对象之旅软件生命周期
    函数参数栈传递
    看完后停下来想想我们究竟在追求什么???
    面向对象之旅设计与设计原则
    [译]多重继承和虚继承的内存布局
    61条面向对象设计的经验原则
    数据库设计14个技巧(转)
    js的tween
    三、windows8 store
  • 原文地址:https://www.cnblogs.com/floodwater/p/10002259.html
Copyright © 2020-2023  润新知