【问题标题】:Passing form parameters to Model Formset将表单参数传递给模型表单集
【发布时间】:2014-09-17 05:51:09
【问题描述】:

我已经创建了:

  1. 一个模型
  2. 对应的模型表单
  3. 使用2中的表单创建模型formset的对应视图。

以下是代码:

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 从我的 views.py 传递给表单,为此我通过添加 init 方法对表单进行了更改(目前在上面的代码中评论),但是我不知道如何将登录用户从views.py传递到这个表单。

我试过什么? 这个question中提到的解决方案

但是,这种剂量似乎适用于模型 fromset 。

  1. 尝试在表单集中调用下面的代码,我知道它错了,但只是一个试验!

    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 中得到打印语句的输出 请求此表单的用户是管理员

但是我得到'RequestUser' 异常类型:KeyError 异常值:

有什么建议吗?

【问题讨论】:

  • 你应该在 view.py 方法的顶部使用注解 @login_required

标签: django forms django-forms


【解决方案1】:

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))

您可以使用ExpenditureForm 中的请求来获取表单中的登录用户

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)

【讨论】:

  • 我不明白你的意思是什么?其次我还不想通过 request.POST ..
  • 您可以在模型表单中传递请求以获取登录用户,而不是传递字符串。您可以从表单中删除 request.POST。
  • @paarthbatra 我已经进行了编辑。现在您可以在表单中看到获取登录用户的代码
  • 嘿!这与我在问题中解释的完全一样,我也传递了一个参数,而你传递了整个请求,我仍然得到同样的错误。__init__() 得到了一个意外的关键字参数“请求”
  • 我在第 2 点尝试过的解释相同,你的答案结果相同,我得到与上面相同的打印输出,我得到相同的错误
猜你喜欢
  • 2023-03-19
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 2020-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多