'User' 对象没有带有表单集的属性 'get'(通过用户获取查询集)

'User' object has no attribute 'get' with formset (passing user to get a queryset)

我正在尝试显示特定用户的表单集。

如果用户在 'medical tab',那么它应该为用户的每个依赖项显示一个小表单(一个复选框和一个文本框)。

在我的 views.py 我有这个:

def get_dep_form(benefit_tab, user):
    if benefit_tab == 'medical':
        DepMedFormSet = formset_factory(DependentMedicalBenefitForm)
        link_formset =  DepMedFormSet(user)
    else:
        return None
    return link_formset

在我的 forms.py 我有这个:

class DependentMedicalBenefitForm(forms.ModelForm):
    has_medical = forms.BooleanField()
    med_group_id = forms.CharField(max_length=10)
    class Meta:
        model = Dependent
        fields = [
            'has_medical', 'med_group_id'
        ]

    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        queryset = Dependent.objects.filter(employee=self.user)
        super(DependentMedicalBenefitForm, self).__init__(*args, **kwargs)
        self.fields['has_medical'].queryset = queryset
        self.fields['med_group_id'].queryset = queryset

在我的 views.py 中,我得到这样的表格:

def index(request, benefit_tab=None):
     #stuff
     if benefit_tab:
          link_formset = get_dep_form(benefit_tab, request.user)
return render(request, 'benefits/index.html', {
     #stuff
     'link_formset': link_formset,
})

我运行进入错误:'User' object has no attribute 'get'

如果我不传递用户,并注释掉 init 函数,那么它会按预期显示单个复选框和文本框 - 但我不明白为什么以这种方式传递用户是行不通的。

奖励积分:如果您知道如何使用相应的数据预填充表单集 - 这是我克服 'User' 错误后的下一步。

您将用户作为位置参数传递给表单集的实例化,但表单集期望那里有 POST 数据。您想要的是将该值作为关键字参数传递给 forms

幸运的是,由于 Django 1.9 表单集通过 form_kwargs argument 支持这一点。所以你应该这样做:

link_formset =  DepMedFormSet(form_kwargs={'user': user})

您没有在处理该表单集的地方显示代码,但请记住也要在那里传递 form_kwarg。