Niladry Kar
Niladry Kar

Reputation: 1203

How to perform queries in django modelform?

I tried this in my modelform:

class Ledgerform(forms.ModelForm):

class Meta:
    model = ledger1
    fields = ('name', 'group1_Name')


def __init__(self, User, Company,  *args, **kwargs):
    self.User = kwargs.pop('User', None)        
    self.Company = kwargs.pop('Company', None)
    super(Ledgerform, self).__init__(*args, **kwargs)
    self.fields['name'].widget.attrs = {'class': 'form-control',}
    self.fields['group1_Name'].queryset = group1.objects.filter(User= self.User,Company = self.Company)

In my views.py I have done something like this:

class ledger1ListView(LoginRequiredMixin,ListView):
    model = ledger1
    paginate_by = 15

    def get_queryset(self):
        return ledger1.objects.filter(User=self.request.user, Company=self.kwargs['pk'])

class ledger1CreateView(LoginRequiredMixin,CreateView):
    form_class = Ledgerform

    def form_valid(self, form):
        form.instance.User = self.request.user
        c = company.objects.get(pk=self.kwargs['pk'])
        form.instance.Company = c
        return super(ledger1CreateView, self).form_valid(form)

I want to perform the the same query that I have passed in my ledger1ListView by using queryset in my modelform but my kwargs.pop is not returning the current user or the company...

This is my models.py:

class ledger1(models.Model):
    User            = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE,null=True,blank=True)
    Company         = models.ForeignKey(company,on_delete=models.CASCADE,null=True,blank=True,related_name='Companys')
    name            = models.CharField(max_length=32)
    group1_Name     = models.ForeignKey(group1,on_delete=models.CASCADE,blank=True,null=True)

Do any one know what I am doing wrong in my code?

Thank you in advance

Upvotes: 1

Views: 948

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476659

You can override the FormMixin.get_form_kwargs [Django-doc] in your view, that it constructs a dictionary with the parameters necessary to initialize the form, like:

class ledger1CreateView(LoginRequiredMixin,CreateView):
    form_class = Ledgerform

    def get_form_kwargs(self):
        data = super(ledger1CreateView, self).get_form_kwargs()
        data.update(
            User=self.request.User,
            Company=company.objects.get(pk=self.kwargs['pk'])
        )
        return data

The form_valid function is called after the form is constructed, validated and appears to be valid. Typically it is used to redirect the user to the "success page".

Upvotes: 1

Related Questions