从ModelMultipleChoiceField复选框中检索值

时间:2019-06-07 15:56:43

标签: python django forms model

大图:最终我不知道我是否正确地解决了这个问题,但这是我所掌握的。

我正在为草坪护理行业服务提供商构建平台。每个公司都有能力提供不同的服务,因此我建立了一个模型,该模型允许每个服务提供商创建自己的服务。

服务提供商为他们的客户设置约会时,我希望他们能够从复选框列表中进行选择。

我在很大程度上引用了此线程来显示登录的用户条目。 Customizing django form based on currently logged in user

我已经根据登录的用户正确显示了服务列表,但是我在POST处理/验证方面遇到了麻烦。

该表单可以正确保存除选中复选框之外的所有位置。我最终希望将那些以逗号分隔格式保存到Charfield中的其他模型“ form_a”中。

Here is the display of my current form.

视图的相应部分:

def new_booking(request):
    page_title = "New Booking"
    template = 'jobs/new-booking.html'
    customer_id = request.GET.get('customer')
    customer = ''

    form_a = AddJob(request.POST or None)
    form_b = AddJobDatePicker(request.POST or None)
    form_c = PersonForm2(request.POST or None)
    form_d = AddJobServices(**{'user': request.user})

    more_info = False

    if request.method == 'POST':
        if form_a.is_valid() and form_b.is_valid():
            services = filter(lambda t: t[0] in form_d.fields['service_name'], form_d.fields['service_name'].choices)


            a = form_a.save(commit=False)
            b = form_b.save(commit=False)
            d = form_d.save(commit=False)
            # a.customer_id = CustoemrDB.objects.values_list('completed', flat=True).get(pk=pk)
            # a.booking_id = Jobs_DB.objects.values_list('pk', flat=True).get(pk=pk)
            a.customer_id = CustomerDB.objects.get(pk=152)
            a.service_request = services
            a.date_scheduled = b.date
            a.payment_method = 'visa'
            a.save()
            return redirect('index')
        else:
            return redirect('new-booking')

表格:

class AddJobServices(forms.ModelForm):
    service_name = forms.ModelMultipleChoiceField(
        widget=forms.CheckboxSelectMultiple,
        queryset=ContractorServices.objects.values_list('service_name', flat=True),
    )

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user', None)
        super(AddJobServices, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_show_errors = True

        if user is not None:
            self.fields['service_name'].queryset = ContractorServices.objects.filter(service_parent=user).values_list('service_name', flat=True)

    class Meta:
        model = ContractorServices
        fields = {'service_name'}

型号:

class ContractorServices(models.Model):
    service_parent = models.ForeignKey(User, on_delete=models.CASCADE, default=None)
    service_name = models.CharField(max_length=150, null=True, blank=True)
    sub_service = models.CharField(max_length=150, null=True, blank=True)   # this isn't currently used but might be at some point.
    archive = models.BooleanField(default=False, null=True)

我不确定我是否正确处理了这个问题,是否愿意重新开始,但我感觉自己已经接近了。在Discord上还告诉我,ModelMultipleChoiceField仅适用于M2M关系,但是我拥有的设置是使它正确显示的唯一方法。

感谢您的帮助。

0 个答案:

没有答案