Как отфильтровать опции поля select на основе значения другого поля того же типа в форме Django? [закрыто] [закрыто

Проблема у меня следующая, я хочу получить доступ к выбранному в реальном времени значению поля select в моей форме и на основе этого отфильтровать варианты для клиента.

Конкретное поле - это то, которое соответствует в модели Запрос атрибуту product_type, который в зависимости от варианта, выбранного вами из выбора, фильтрует второе поле, поле продукта (Product имеет fk, указывающий на product_type)

mis models.py

class ProductType(models.Model):
    name = models.CharField("Nombre", max_length=100)

    def __str__(self):
        return f'{self.name}'


class Product(models.Model):
    name = models.CharField("Producto", max_length=250)
    price = models.IntegerField("Price")
    type = models.ForeignKey(ProductType, on_delete = models.CASCADE)
    
    def __str__(self):
        return f'{self.name}'

class Request(models.Model):
    CUSTOMER_TYPE = [
        ('IND', 'Individuos'),
        ('NEG', 'NEGOCIOS'),
    ]

    COMPANIES = [
        ('CLA', 'Claro'),
        ('PER', 'Personal'),
        ('TUE', 'Tuenti'),
        ('MOV', 'Movistar'),
        ('OTR', 'Otro'),
    ]

    types = ProductType.objects.all()
    PRODUCT_TYPE = []

    for o in types:
        key = o.name[:3]
        value = o.name
        t = (key,value)
        PRODUCT_TYPE.append(t)
    

    customer_type = models.CharField(max_length=150, choices=CUSTOMER_TYPE)
    product_type = models.CharField(max_length = 150, choices = PRODUCT_TYPE)
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    date_of_sale = models.DateTimeField(auto_now_add=True)
    request_source = models.ForeignKey(RequestSource, on_delete=models.CASCADE)
    seller = models.ForeignKey(User, on_delete=models.CASCADE)
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    
    #Portability
    current_company = models.CharField(max_length=150, choices=CUSTOMER_TYPE)
    mobile_to_carry = models.CharField("Número a portar", max_length=13)
    pin = models.IntegerField("Pin")

    #Internet services
    address_coordinates = models.TextField("Coordenadas del Domicilio", max_length=400)
    other_references = models.TextField("Otras Referencias", max_length=400)
    
    #Aditional information
    attached_files = models.FileField(upload_to='media/adjuntos/%Y/%m/%d/')
    comments = models.TextField("Comentarios", max_length=300)
    
    #Request status
    request_status = models.ForeignKey(RequestStatus, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.id} - {self.product} - {self.customer}'

    class Meta:
        ordering = ['date_of_sale']

mis forms.py

class CustomerForm(forms.ModelForm):
    class Meta:
        model = Customer
        fields = '__all__'

class RequestForm(forms.ModelForm):
    
    class Meta:

        model = Request
        fields = ['customer_type','product_type','product','request_source',]

        def __init__(self, user, *args, **kwargs):
            super(RequestForm, self).__init__(*args, **kwargs)
            self.fields['product'].queryset = Product.objects.filter(type = self.product_type)
        
        def form_valid(self, form):
            form.instance.product = Product.objects.filter(type = self.product_type) 
            form.instance.seller = self.request.user
            return super().form_valid(form)  

mis views.py

class RequestCreateView(LoginRequiredMixin,CreateView):
    model = Request
    template_name = 'request/request.html'
    form_class = RequestForm
    second_form_class = CustomerForm
    success_url = reverse_lazy('home')

    def get_context_data(self, **kwargs):
        context = super(RequestCreateView, self).get_context_data(**kwargs)
        if 'form' not in context:
            context['form'] = self.form_class(self.request.GET)
        if 'form2' not in context:
            context['form2'] = self.second_form_class(self.request.GET)
        
        return context

    def post(self, request, *args, **kwargs):
        self.object = self.get_object
        form = self.form_class(request.POST)
        form2 = self.second_form_class(request.POST)
        if form.is_valid() and form2.is_valid():
            request = form.save(commit = False)
            request.customer = form2.save()
            request.save()
            return HttpResponseRedirect(self.get_success_url())
        else:
            return self.render_to_response(self.get_context_data(form = form, form2=form2))

Например, если у меня есть масло, сыр и молоко, то они будут типа Dairy, а вино и пиво - типа Drinks.

Если в форме я выбираю тип продукта (тип_продукта) = Молочный, то в следующем поле продукты (продукт) появляются только отфильтрованные те, которые имеют тип Молочный и наоборот, если я выбираю другой тип_продукта. Я не знаю, где я должен сделать фильтр, в форме или в представлении, или даже если это можно сделать в модели или в html.

В HTML поле product_type отображается как Select с типами продуктов, которые я создал в базе данных, и продукты отображаются таким же образом, но они не фильтруются. Я хотел бы уточнить, что мне хотелось бы, чтобы фильтр выполнялся в режиме реального времени.

Я попробовал несколько решений из forms.py REQUEST, например, то, которое я пробовал в init и в form_valid для фильтрации товаров с помощью django orm и queryset, но без успеха

.
Вернуться на верх