Django 将表单参数传递给模型表单集

Django 将表单参数传递给模型表单集,django,forms,django-forms,Django,Forms,Django Forms,我创造了: 模型 相应的模型形式 相应的视图,使用2中的表单创建模型表单集 代码如下: 1.型号: class Expenditure(models.Model): exp_owner= models.CharField(default='None',max_length=50) exp_date = models.DateTimeField("Expenditure_Date") description = models.CharField(max_length=100

我创造了:

  • 模型
  • 相应的模型形式
  • 相应的视图,使用2中的表单创建模型表单集
  • 代码如下:

    1.型号:

    class Expenditure(models.Model):
        exp_owner= models.CharField(default='None',max_length=50)
        exp_date = models.DateTimeField("Expenditure_Date")
        description = models.CharField(max_length=1000)
        amount = models.FloatField(default=0)
        currency = models.CharField(max_length=15,default="MYR",editable=True)
        exp_pocket = models.ForeignKey(Pockets, null=True, blank=True)
        exp_type = models.ForeignKey(Types_of_Expenditures)
        class Meta:
            unique_together = ('exp_date', 'description',)
        def __unicode__(self):
            return self.description
    
    2.相应的模型形式:

    class ExpenditureForm(forms.ModelForm):
        #def __init__(self,*args, **kwargs):
            #self.requestUser = kwargs.pop("RequestUser")
            #super(ExpenditureForm, self).__init__(*args, **kwargs)
            #print "User who requested this form is ",self.requestUser
    
        def initialExpType(self):
            lengthOfTypesOfExpenditures=len(Types_of_Expenditures.objects.filter(Expenditure_owner=self.requestUser))
            print "current types of expenditures are ",lengthOfTypesOfExpenditures
            if lengthOfTypesOfExpenditures > 0:
                return Types_of_Expenditures.objects.filter(Expenditure_owner=self.requestUser)[:1].get()
            else:
                return "Null"
        exp_date = forms.DateTimeField(widget=AdminDateWidget(attrs={'class':'datetimeField'}))
        description = forms.CharField(show_hidden_initial=True,max_length=1000)
        exp_type = forms.ModelChoiceField(queryset=Types_of_Expenditures.objects.filter(Expenditure_Type_Enable=True),initial=initialExpType)
        amount = forms.FloatField(initial=0)
    exp_pocket = forms.ModelChoiceField(show_hidden_initial=True,queryset=Pockets.objects.all(),initial=Pockets.objects.filter()[:1].get())
        class Meta:
            model = Expenditure
    
    3.对应视图

    我将视图中第2点中的对应形式称为:

    ExpFormSet = modelformset_factory(Expenditure,extra=10,max_num=10,
                    fields=('exp_date', 'description','exp_type','amount','exp_pocket'),
                    can_delete=False,form=ExpenditureForm))
    
    而且效果很好

    问题 我想将登录用户传递到我的表单,即,我想将request.user从my views.py传递到表单,为此,我通过添加init方法(目前在上述代码中注释)在表单中进行了更改,但我不确定如何将登录用户从views.py传递到该表单

    我试过什么? 本文中提到的解决方案

    然而,该剂量似乎适用于fromset模型

  • 试着在表单集中调用下面的代码,我知道这是错误的,但只是一次尝试

    ExpFormSet = modelformset_factory(Expenditure,extra=10,max_num=10,
                fields=('exp_date', 'description','exp_type','amount','exp_pocket'),
                can_delete=False,form=ExpenditureForm(RequestUser=str(request.user)))
    
  • 这样做,我确实可以从表单的init获得print语句的输出 请求此表单的用户是管理员

    但是我得到了“RequestUser” 异常类型:KeyError 异常值:


    有什么建议吗?

    ModelForm
    中,您只需使用

    ExpFormSet = modelformset_factory(Expenditure,extra=10,max_num=10,
                fields=('exp_date', 'description','exp_type','amount','exp_pocket'),
                can_delete=False,form=ExpenditureForm(request=request))
    
    您可以使用
    支出改革
    中的请求作为用户登录表单

    class ExpenditureForm(forms.ModelForm):
        def __init__(self,*args, **kwargs):
            print "User who requested this form is ",kwargs['request'].user
            super(ExpenditureForm, self).__init__(*args, **kwargs)
    

    您应该在视图中的方法顶部使用注释
    @login\u required
    。pyi不明白您的意思?其次,我还不想传递request.POST..您可以在模型表单中传递请求以获取登录用户,而不是传递字符串。您可以从表单中删除request.POST。@parthbattra我已经做了编辑。现在,您可以在formHey中看到获取登录用户的代码!这与我在问题中所解释的完全相同,我也在传递一个参数,而你在传递整个请求,我仍然会得到相同的错误。uu init_uu()得到了一个意外的关键字参数'request',与我在第2点中所解释的相同,你的回答结果相同,我得到与上面相同的打印输出,并且得到相同的错误