具有ModelChoiceField和查询过滤器的Django ModelForm

时间:2019-03-25 03:41:35

标签: django modelform

我需要根据传递给单个公司的表单中的数据在下拉列表中创建案例列表。

我将ID传递给表单,但是如何在CaseChoiceField查询中使用它?

仅在查询中使用id或self.id无效。

首先在视图中

form = NewProjectCaseForm ( id = f.id )

模型形式:

class NewProjectCaseForm ( forms.Form ):

    # get all the cases for the firm
    # how do I get the ID from below ???

    case = CaseChoiceField ( queryset = Case.objects.filter (firm_id = id ) )

    def __init__ ( self, *args, **kwargs ):

        # id from the view
        self.id = kwargs.pop ( 'id' )

        super ( NewProjectCaseForm, self ).__init__ ( *args, **kwargs )
        self.helper = FormHelper ()
        self.helper.layout = Layout (

        Div (
            Div ( 'case', css_class = 'large-10 cell' ),
            css_class = 'grid-x'
        ),

        ButtonHolder (
            Submit ( 'submit', 'Add Case', css_class = 'button small-6' )
        )
    )

要创建下拉菜单,请使用以下代码:

class CaseChoiceField ( ModelChoiceField ):

    def label_from_instance ( self, obj ):
        return '{} - {}'.format ( obj.name, obj.firm )

我正在使用Crispy表单(适用于Foundation)

我希望这是有道理的。

非常感谢您。

1 个答案:

答案 0 :(得分:1)

您必须使用如下所示的__init__方法。

self.fields['case'] = CaseChoiceField (queryset=Case.objects.filter(firm_id=self.id))

现在,该表单如下所示

class NewProjectCaseForm ( forms.Form ):
    def __init__ ( self, *args, **kwargs ):
        # id from the view
        self.id = kwargs.pop ( 'id' )
        super ( NewProjectCaseForm, self ).__init__ ( *args, **kwargs )
        self.fields['case'] = CaseChoiceField (queryset=Case.objects.filter(firm_id=self.id))
        self.helper = FormHelper ()
        self.helper.layout = Layout (

        Div (
            Div ( 'case', css_class = 'large-10 cell' ),
            css_class = 'grid-x'
        ),

        ButtonHolder (
            Submit ( 'submit', 'Add Case', css_class = 'button small-6' )
        )
    )