【问题标题】:Django ModelForm with ModelChoiceField and Query Filter带有 ModelChoiceField 和查询过滤器的 Django ModelForm
【发布时间】:2019-08-15 07:00:57
【问题描述】:

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

我将 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)

我希望这是有道理的。

非常感谢。

【问题讨论】:

    标签: django modelform


    【解决方案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' )
            )
        )
    

    【讨论】:

    • 太棒了!非常非常感谢你。我永远不会想到这一点。
    猜你喜欢
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    相关资源
    最近更新 更多