Выбор динамического поля Django ModelForm для конкретной модели - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь настроить варианты полей 'cost_name' для фильтрации на основе динамического идентификатора проекта.

models.py

class ProjectCost(models.Model):
    project_name = models.ForeignKey(ProjectName, on_delete=models.CASCADE,null=True)
    cost_name = models.CharField('Cost Name', max_length=50)
    total_budget = models.DecimalField('Total Budget', max_digits=9,decimal_places=2)

forms.py

class CreateCostForm(forms.ModelForm):

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

        super(CreateCostForm, self).__init__(*args, **kwargs)
        self.fields['cost_name'].queryset = ProjectCost.objects.filter(project_name_id=project_id)

    class meta:
        model = ProjectCost

Когда я жестко кодирую значение project_id, например:

self.fields['project_name'].queryset = ProjectCost.objects.filter(project_name_id=4) or 
ProjectCost.objects.filter(project_name_id= 8),

, я получаю правильные отфильтрованные параметры в форме. Как я могу сделать project_id динамическим?

Я пытался:

def __init__(self, *args, **kwargs):
    project_id = kwargs.pop('project_id', None)
    super(CreateCostForm, self).__init__(*args, **kwargs)
    self.fields['cost_name'].queryset = ProjectCost.objects.filter(project_name_id=project_id)

Но это возвращает 'Нет' для значения 'project_id'. Есть идеи, как это исправить?

Спасибо.

1 Ответ

1 голос
/ 08 ноября 2019

Поскольку вы подклассифицируете от CreateView, то есть вызов метода get_form_kwargs() для отправки данных из Просмотр в Форма . Просто переопределите это так:

class YourView(CreateView):
     ...
     def get_form_kwargs(self, *args, **kwargs):
         form_kwargs = super(YourView, self).get_form_kwargs(*args, **kwargs)
         form_kwargs['project_id'] = self.kwargs.get('project_id')  # assuming you send the project_id through url ie path('project/<int:project_id>/create/', YourView.as_view())
         return form_kwargs

Таким образом, вы получите данные в project_id в форме:

Class CreateCostForm(forms.ModelForm):
     def __init__(self, *args, **kwargs):
        project_id = kwargs.pop('project_id', None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...