Как отфильтровать опции поля 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, но без успеха
.