Django ModelForm特定模型的动态字段选择

Django ModelForm特定模型的动态字段选择,django,django-models,django-forms,Django,Django Models,Django Forms,我正在尝试根据动态项目id筛选“成本名称”字段选项 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.DecimalF

我正在尝试根据动态项目id筛选“成本名称”字段选项

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),
我在表单上获得了正确的筛选选项。那么如何使项目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'的值,它返回'None'。你知道怎么解决这个问题吗


谢谢。

当您从
CreateView
进行子分类时,有一个方法调用将数据从视图发送到表单。就像这样覆盖它:

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

我不是分类。我会尝试一下,然后告诉你。谢谢你的及时回复。谢谢,正是我想要的!
Class CreateCostForm(forms.ModelForm):
     def __init__(self, *args, **kwargs):
        project_id = kwargs.pop('project_id', None)