'user'对象没有使用formset的'get'属性(传递用户获取查询集)

时间:2017-09-18 15:36:34

标签: python django django-forms formset

我正在尝试为特定用户显示一个formset。

如果用户位于“医疗标签”上,则应为每位用户显示一个小格式(复选框和文本框)。

在我的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 功能,那么它会按预期显示一个复选框和文本框 - 但我无法弄清楚为什么以这种方式传递用户没有用。

奖励积分:如果您知道如何使用相应的数据预填充表单集 - 一旦我超过“用户”错误,这就是下一步。

1 个答案:

答案 0 :(得分:0)

您将用户作为位置参数传递给formset的实例化,但是formset期望POST数据存在。您想要的是将该值作为关键字arg。

传递给表单

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

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

您不会显示处理该formset的代码,但请记住也将那个form_kwarg传递给它。