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

Django ModelForm with ModelChoiceField and Query Filter

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

我将 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 表格(用于基础)

我希望这是有道理的。

非常感谢。

您必须使用如下所示的 __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' )
        )
    )