【问题标题】:Limit forms foreign key to a choices in related model限制形成相关模型中选择的外键
【发布时间】:2021-12-10 16:17:03
【问题描述】:

我正在创建一个表单,但遇到了这个问题。

我在商业模式中有几家公司。每个企业都有自己的服务中服务模型。用户仅与一项业务相关联。 Business、Service 都有关系。

我的挑战

我有一份服务申请表。当我展示此服务请求模型表时,我只想显示客户/用户所属的 One Business 的服务。请帮助我这是怎么可能的。我认为这就像“实例=业务”。我明白事情没那么简单。

例如:Business1 将“汽车”和“摩托车”作为服务,而 Business2 将“指甲”和“Hair Spa”作为服务。如果来自 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})

'''

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    您可以在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})
    
    

    【讨论】:

      【解决方案2】:

      一种方法是使用django-select2See installation instructions here

      然后在你的表单中你可以这样做:

       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 选项。阅读更多关于它的信息here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-29
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        • 2010-09-18
        • 2012-10-16
        • 1970-01-01
        相关资源
        最近更新 更多