Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django modelformset_factory() filtering

I'm needing to filter out a significant amount of objects from my query. Currently, it is grabbing all objects in the class, and I want to filter it to the relevant ones which are in a querystring. How can I do this? When I try, I get an Attribute Error stating

''QuerySet' object has no attribute '__name__'.'

The code that works, but very slowly is:

formset = modelformset_factory(Transaction, form=PaidDateForm, extra=0, can_delete=False)

Also, the formset:

formset = formset(request.POST, Transaction.objects.filter(pk__in=qs))

The QueryString that I am wanting to filter by is called 'qs.'

class PaidDateForm(forms.ModelForm):
    formfield_callback = jquery_datefield
Amount",max_digits=14,decimal_places=2,required=False)
    date_cleared = forms.DateField(label="Cleared Date",widget=JQueryDateWidget(), input_formats=settings.DATE_INPUT_FORMATS, required=False)

    class Meta:
        model = Transaction
        include = ('date_time_created')

    def __init__(self, *args, **kwargs):
        self.queryset = Transaction.objects.filter(pk__in=qs)
        super(PaidDateForm, self).__init__(*args, **kwargs)
        for field in self.fields:
            if field != 'date_cleared':
                self.fields[field].widget = forms.HiddenInput()
        self.fields['paid_amount'].widget.attrs['size'] = 12
        self.initial['paid_amount'] = '%.2f' % (self.instance.usd_amount)
like image 934
user2498453 Avatar asked Jun 19 '13 17:06

user2498453


1 Answers

Look at the example in Django documentation: https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#changing-the-queryset

If I understand your question correctly there is two approach to your problem:

First:

TransactionFormset = modelformset_factory(Transaction,form=PaidDateForm, extra=0, can_delete=False)
formset = TransactionFormset(queryset=Transaction.objects.filter(pk__in=qs))

Second options is to create BaseTransactionFormset

class BaseTransactionFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(BaseTransactionFormSet, self).__init__(*args, **kwargs)

        #create filtering here whatever that suits you needs
        self.queryset = Transaction.objects.filter()

formset = modelformset_factory(Transaction, formset=BaseTransactionFormSet,form=PaidDateForm, extra=0, can_delete=False)

Does this code help you?

like image 87
galuszkak Avatar answered Oct 03 '22 08:10

galuszkak