Django ModelForm с ModelChoiceField и фильтром запросов - PullRequest
1 голос
/ 25 марта 2019

Мне нужно создать список дел в раскрывающемся списке из данных, переданных в форму для отдельной фирмы.

Я передаю идентификатор в форму, но как мне использовать его в запросе 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 )

Я использую хрустящие формы (для основы)

Надеюсь, это имеет смысл.

Большое спасибо.

1 Ответ

1 голос
/ 25 марта 2019

Вы должны использовать метод __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' )
        )
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...