大图:最终我不知道我是否正确地解决了这个问题,但这是我所掌握的。
我正在为草坪护理行业服务提供商构建平台。每个公司都有能力提供不同的服务,因此我建立了一个模型,该模型允许每个服务提供商创建自己的服务。
服务提供商为他们的客户设置约会时,我希望他们能够从复选框列表中进行选择。
我在很大程度上引用了此线程来显示登录的用户条目。 Customizing django form based on currently logged in user
我已经根据登录的用户正确显示了服务列表,但是我在POST处理/验证方面遇到了麻烦。
该表单可以正确保存除选中复选框之外的所有位置。我最终希望将那些以逗号分隔格式保存到Charfield中的其他模型“ form_a”中。
视图的相应部分:
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关系,但是我拥有的设置是使它正确显示的唯一方法。
感谢您的帮助。