0

I have created :

  1. A model
  2. A corresponding model form
  3. Corresponding view which creates a model formset using the form in 2.

Below are the codes :

1.Model :

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.corresponding model form :

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.corresponding view

I call the corresponding form as in point 2 in the view as :

ExpFormSet = modelformset_factory(Expenditure,extra=10,max_num=10,
                fields=('exp_date', 'description','exp_type','amount','exp_pocket'),
                can_delete=False,form=ExpenditureForm))

and it works great .

Problem I want to pass the logged in user to my form i.e. i want to pass request.user from my views.py to the form and to do that i did changes in the form by adding the init method ( currently commented in above code) , however i am not sure how to pass the logged in user from the views.py to this form .

What i tried ? Solution mentioned in this question

However this dosent seems to work for model fromset .

  1. tried calling below code in formset , i know its wrong but just a trial !

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

Doing this i do get output of print statement from init of form as User who requested this form is admin

However i get 'RequestUser' Exception Type: KeyError Exception Value:

Any Advice ?

Community
  • 1
  • 1
paarth batra
  • 1,392
  • 4
  • 29
  • 53

1 Answers1

-1

In ModelForm you can simply pass request using

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

You can use the request in your ExpenditureForm to get logged in user in your forms as

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)
Raj Subit
  • 1,487
  • 2
  • 12
  • 23
  • i couldnt understand what do you mean ? secondly i dont want to pass request.POST yet .. – paarth batra Sep 17 '14 at 07:48
  • You can pass the request in your modelform to get the logged in user rather than passing a string. And you can remove the request.POST from the form. – Raj Subit Sep 17 '14 at 08:02
  • @paarthbatra I have made the edits. Now you can see the code to obtain logged in user in your form – Raj Subit Sep 17 '14 at 08:21
  • Hey ! This is exactly same what i have explained in my question , i am also passing a parameter and you are passing whole request , I still get same error .__init__() got an unexpected keyword argument 'request' – paarth batra Sep 17 '14 at 08:43
  • same thing which i have explained in point 2 of what i tried , your answer results in same , i get print output same as above and i get same error – paarth batra Sep 17 '14 at 08:44
  • May be a bit silly but have you added "django.core.context_processors.request" in your TEMPLATE_CONTEXT_PROCESSORS settings ? – Raj Subit Sep 17 '14 at 09:32