0

I am a new django/python user and I am having an issue using django-filters with related models. I have created a tutorial application for myself with two models:

class Customer(models.Model):
    def __str__(self):
        return self.Customer_Name
    Customer_Name = models.CharField(max_length=100)
    SFDC_Customer_Record_Number = models.IntegerField(default='')
    Zone = models.CharField(max_length=50, default='')
    Government = models.BooleanField(default=False)
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.DO_NOTHING,default=User)
    
class Vue_Quote(models.Model):
    def __str__(self):
        return self.Quote_Name
    Quote_Name = models.CharField(max_length=100)
    SFDC_Golden_Opp_ID = models.IntegerField()
    Vue_System_Count = models.IntegerField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.DO_NOTHING,default=User)
    Quote_Type = models.CharField(max_length=100)
    Customer = models.ForeignKey(Customer , on_delete=models.DO_NOTHING, default='')

I have also created a filter.py file:

import django_filters
from .models import *

class CustomerFilter(django_filters.FilterSet):

    class Meta:
        model = Customer
        fields = {
            'Customer_Name': ['icontains'], 
            'Zone' : ['icontains'],
        }


class QuoteFilter(django_filters.FilterSet):

    class Meta:
        model = Vue_Quote
        fields = {
            'Quote_Name': ['icontains'], 
            'author__username' : ['icontains'],
            'Customer__Customer_Name' : ['icontains'],
        }

In my templates I want to display the filter fields for quoteFilter and customerFilter (this is working). Then I have a sort of gallery/list that iterates through each customer and their respective quotes. My issue is that only my customerFilter works. I cannot find anyway to create nested for loops that can provide results for the user input across both model's fields.

Here is my current html which works for the customer filter but does not attempt to filter the quote content at all:

% extends "base.html" %}
{% load bootstrap %}
{% block content %}
<form method="get">
    {{customerFilter.form|bootstrap}}
    {{quoteFilter.form|bootstrap}}
    <button class= "btn btn-primary" type="submit">Search</button>
</form>
{% if user.is_authenticated %}
    <h2>Quote Explorer Gallery</h2>
        <p></p>
        {% for Customer in customerFilter.qs %}
            {% for Quote in Customer.vue_quote_set.all %}

<HTML WITH CONTENT CONTINUES HERE>

Here is my view in case anyone needs to see it:

    Customers = Customer.objects.all()
    Quotes = Vue_Quote.objects.all().prefetch_related('Customer')
    customerFilter = CustomerFilter(request.GET, queryset=Customers)
    quoteFilter = QuoteFilter(request.GET, queryset=Quotes)
    context = {
        'Users': User.objects.all(),
        'Customers': customerFilter.qs,
        'Quotes': quoteFilter.qs,
        'customerFilter' : customerFilter,
        'quoteFilter' : quoteFilter,
    }
    print(context)
    return render(request, 'home.html', context)

If anyone can advise how I can change my nested for loop, or how I can address the entire multi-model search differently I would be very grateful. Thank you.

0 Answers0