Question

I'm currently working with django project. I had to filter the data store on the database based on the user input on form (at template) as looked below.

enter image description here

On form user either enter value or leave it blank. So what I have to do is first find the (valid) user input and then fire appropriate query to display data as user input in the form. So final result should be displayed on table at template.

As I'm new to django, how should I have to pass the data and fire query to represent data at multiple field. As help or link related to these type problem are expected. ( I just able to filter from the database with only one form and had no concept to solve this.)

Model of my temp project is as below.

class exReporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()
    gender = models.CharField(max_length=1)
    age = models.IntegerField()
    label = models.IntegerField()
Was it helpful?

Solution

There are a number of approaches you can take, but here is one solution you can use that involves chaining together the appropriate filters based on the form's posted data:

*Note: To conform to Python's naming convention, rename exReporter class to ExReporter.

# views.py
def process_ex_reporter_form(request):
    if request.method == "POST":
        # ExReporterForm implementation details not included.
        ex_reporter_form = ExReporterForm(request.POST)

        if ex_reporter_form.is_valid():
            # If form field has no data, cleaned data should be None.
            gender = ex_reporter_form.cleaned_data['gender']
            age_start = ex_reporter_form.cleaned_data['age_start']
            age_end = ex_reporter_form.cleaned_data['age_end']
            aggregation_group = ex_reporter_form.cleaned_data['aggregation_group']
            aggregation_id = ex_reporter_form.cleaned_data['aggregation_id']

            ex_reporters = ExReporter.objects.get_ex_reporters(gender, age_start,
                               age_end, aggregation_group, aggregation_id)

        else:
            # Pass back form for correction.
            pass

    else:
        # Pass new form to user.
        pass

# models.py
class ExReporterManager(models.Manager):
    def get_ex_reporters(self, gender, age_start, age_end, aggregation_group,
                         aggregation_id):

        ex_reporters = super(ExReporterManager, self).get_query_set().all()

        # Even though the filters are being applied in separate statements,
        # database will only be hit once.
        if ex_reporters:
            if gender:
                ex_reporters = ex_reporters.filter(gender=gender)

            if age_start:
                ex_reporters = ex_reporters.filter(age__gt=age_start)

            if age_end:
                ex_reporters = ex_reporters.filter(age__lt=age_end)

            # Apply further filter logic for aggregation types supported.

        return ex_reporters
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top