Мне надо отфильтровать service по queryset из init, как передать переменную?
Как передать self.fields['category_service'].queryset
в Device.objects.filter
переменной device?
class FastOrderAddForm(forms.ModelForm):
device = ChoiceTxtField(queryset=Device.objects.filter(category_service=ТУТ_QUERYSET_ИЗ_INIT).order_by('-used'))
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(FastOrderAddForm, self).__init__(*args, **kwargs)
self.fields['category_service'].queryset = getCategoryServicePermission(user=self.request.user)
class Meta:
model = Orders
fields = ['device','category_service']
widgets = {
'category_service': forms.Select(attrs={'class': 'form-control', 'autocomplete': 'on'}),
}
Можно попробовать переопределить метод clean()
class FastOrderAddForm(forms.ModelForm):
device = ChoiceTxtField(queryset=Device.objects.none())
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request', None)
super(FastOrderAddForm, self).__init__(*args, **kwargs)
self.fields['category_service'].queryset = getCategoryServicePermission(user=self.request.user)
def clean(self):
cleaned_data = super().clean()
category_service = cleaned_data.get("category_service")
self.fields['device'].queryset = Device.objects.filter(category_service=category_service).order_by('-used')
class Meta:
model = Orders
fields = ['device','category_service']
widgets = {
'category_service': forms.Select(attrs={'class': 'form-control', 'autocomplete': 'on'}),
}
Ещё можно применить forms.pre_clean
from django.dispatch import receiver
from django import forms
@receiver(forms.pre_clean)
def set_device_queryset(sender, **kwargs):
if isinstance(sender, FastOrderAddForm):
cleaned_data = kwargs['cleaned_data']
category_service = cleaned_data.get("category_service")
sender.fields['device'].queryset = Device.objects.filter(category_service=category_service).order_by('-used')
Ещё способ:
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save, sender=FastOrderAddForm)
def update_device_queryset(sender, instance, **kwargs):
instance.fields['device'].queryset = Device.objects.filter(category_service=instance.cleaned_data.get('category_service')).order_by('-used')