将表单外键限制为相关模型中的一个选项



我正在创建一个表单,但在这个问题上卡住了。

我在商业模式中有几个业务。每个业务在服务模型中都有自己的服务。用户只绑定到一个业务。业务、服务都有关系。

我的挑战

我有一份服务申请表。当我呈现这个服务请求模型表单时,我只想显示客户/用户所属的一个业务的服务。请告诉我这怎么可能。我以为会是"实例=商业"这样的。我明白事情没那么简单。

例如: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选项。点击这里阅读更多信息

相关内容

最新更新