Ограничить внешний ключ формы выбором в связанной модели

Я работаю над созданием формы, но застрял на этой проблеме.

У меня есть несколько бизнесов в Бизнес-модели. Каждый Бизнес имеет свой собственный Сервис в Модели Сервисов. Пользователь привязан только к одному бизнесу. И Бизнес, и Сервис имеют отношения.

Мой вызов

У меня есть форма запроса на обслуживание. Когда я представляю эту форму модели запроса на услугу, я хочу показать только услуги для одного предприятия, к которому принадлежит клиент/пользователь. Пожалуйста, помогите мне, как это возможно. Я думал, что это будет похоже на "Instance = Business". Я понял, что это не так просто.

Например: Бизнес1 имеет "Автомобили" и "Мотоциклы" в качестве услуг, а Бизнес2 имеет "Ногти" и "Спа для волос" в качестве услуг. Если пользователь из Business1 вошел в систему и открыл форму запроса на услугу, он/она должен увидеть только "Автомобили" и "Мотоциклы" в выпадающем списке выбора услуг.

'''

    # class Service(models.Model):
class Business(models.Model):
    name = models.CharField(max_length=25)
    description = models.CharField(max_length=100)
    active = models.BooleanField(default=True)

class BusinessUser(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    business = models.ForeignKey(Business, on_delete=models.CASCADE, related_name='business')
    
class Services(models.Model):   
    business = models.ForeignKey(Business, on_delete=models.CASCADE, related_name='business_services')
    name = models.CharField(max_length=15)
    active = models.BooleanField(default=True)

class ServiceRequest(models.Model):
    business = models.ForeignKey(Business, on_delete=models.DO_NOTHING)
    service = models.ForeignKey(Service, on_delete=models.DO_NOTHING, blank=True)
    requester_name = models.CharField(max_length=15)

 class  ServiceRequestForm(forms.ModelForm):
     class Meta:
        model = ServiceRequest
        fields = '__all__'

def newServiceRequest(request):  //the view
    if request.method == 'GET':
        user = request.user
        business = user.business
        serviceRequestForm = ServiceRequestForm(instance=business)
        return render(request,'service.html', {'form':serviceRequestForm})

'''

Одним из способов является использование django-select2. Смотрите инструкции по установке здесь

Тогда в вашей форме вы можете сделать:

 class  ServiceRequestForm(forms.ModelForm):
     class Meta:
        model = ServiceRequest
        fields = '__all__'
        widgets = {
            'business': ModelSelect2Widget(
                    model=Business,
                    attrs={'class': 'form-control', 'data-minimum-input-length': 0},
                    search_fields=['name__icontains'],
            ),
            'service': ModelSelect2Widget(
                    model=Services,
                    attrs={'class': 'form-control', 'data-minimum-input-length': 0},
                    search_fields=['name__icontains'],
                    dependent_fields={'business': 'business'},
            ),
        }

Ключевым элементом является опция dependent_fields. Подробнее об этом здесь

Вы можете передать текущий бизнес и обновить queryset в ModelForm конструкторе.



class  ServiceRequestForm(forms.ModelForm):

    def __init__(self, business, *args, **kw):
        super(ServiceRequestForm, self).__init__(*args, **kw)
        self.fields['business'].queryset = \
           self.fields['business'].queryset.filter(pk=business.pk)

    class Meta:
        model = ServiceRequest
        fields = '__all__'


def newServiceRequest(request):  # the view
    user = request.user
    business = user.business
    
    if request.method == 'POST':
        serviceRequestForm = ServiceRequestForm(business, data=request.POST)
        if (serviceRequestForm.is_valid()):
             serviceRequest = serviceRequestForm.save()
             # another stuff...
             # ... 
    else:
        serviceRequestForm = ServiceRequestForm(business)

    return render(request,'service.html', {'form':serviceRequestForm})

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