eZ_Harry
eZ_Harry

Reputation: 826

How to make Django Query lookup change based on user input

I am making a search refiner for my website and im currently making a query which returns the relevant listings based on the form a user has filled in. The problem is that the forms fields are optional and I cannot figure out how to make my lookup change based upon which fields are entered. Could someone suggest an efficient way to do this? Cheers!

View -

def browse(request):

    business_industry = request.GET.get('business_industry', '')
    business_address_region = request.GET.get('business_address_region', '')
    employment_type = request.GET.get('employment_type', '')
    pay_rate = request.GET.get('pay_rate', '')
    keywords = request.GET.get('keywords', '')

    form = JobSearchForm()

    job_listings = JobListing.objects.exclude(active_listing=False)

    if business_industry == '' and business_address_region == '' and keywords == '' and pay_rate == '' and employment_type == '':
        print("Nothing has been entered.")
    else:
        print(job_listings)
        print("Something has been entered")
        job_listings = JobListing.objects.filter(
                                Q(job_description__icontains=keywords) &
                                Q(business_industry=business_industry) &
                                Q(business_address_region__icontains=business_address_region)
                                ).distinct()

    context_dict = {
        'joblistings': job_listings,
        'form': form
    }

    return render(request, 'browse.html', context_dict)

Upvotes: 1

Views: 316

Answers (2)

Anoop
Anoop

Reputation: 2798

def browse(request):

    business_industry = request.GET.get('business_industry', '')
    business_address_region = request.GET.get('business_address_region', '')
    employment_type = request.GET.get('employment_type', '')
    pay_rate = request.GET.get('pay_rate', '')
    keywords = request.GET.get('keywords', '')

    form = JobSearchForm()

    filters = Q(active_listing=True)

    if business_industry:
        filters &= Q(business_industry=business_industry)
    if business_address_region:
        filters &= Q(business_address_region__icontains=business_address_region)
    if keywords:
        filters &= Q(job_description__icontains=keywords)

    job_listings = JobListing.objects.filter(filters).distinct()

    context_dict = {
        'joblistings': job_listings,
        'form': form
    }

    return render(request, 'browse.html', context_dict)

Upvotes: 1

uri.lazar
uri.lazar

Reputation: 329

I would go with a simple solution

job_listings = []
if business_industry: job_listings += JobListing.objects.filter(business_industry=business_industry).list()
if keywords: job_listings += JobListing.objects.filter(job_description__icontains=keywords).list()
if business_address_region : job_listings += JobListing.objects.filter(business_address_region__icontains=business_address_region).list()
job_listing = list(set(job_listing))

Upvotes: 2

Related Questions