我正在创建一个表单,但在这个问题上卡住了。
我在商业模式中有几个业务。每个业务在服务模型中都有自己的服务。用户只绑定到一个业务。业务、服务都有关系。
我的挑战
我有一份服务申请表。当我呈现这个服务请求模型表单时,我只想显示客户/用户所属的一个业务的服务。请告诉我这怎么可能。我以为会是"实例=商业"这样的。我明白事情没那么简单。
例如:Business1有" car "one_answers"摩托车";因为《服务与商业》有"钉子"。和"美发护理";为服务。如果来自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})
"
您可以传递当前业务并在ModelForm
构造函数中更新queryset
。
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})
一种方法是使用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
选项。点击这里阅读更多信息