Большая картина: В конечном счете, я понятия не имею, правильно ли я подошел к этому, но это настолько далеко, насколько я понял.
Я создаю платформу для поставщиков услуг по уходу за газонами. Каждая компания может предлагать различные услуги, поэтому я устанавливаю модель, которая позволяет каждому поставщику услуг создавать свои собственные услуги.
Когда поставщик услуг назначает встречу для своего клиента, я хочу, чтобы он мог выбирать из списка флажков.
Я частично ссылался на эту тему, чтобы получить доступ к отображаемым записям пользователей. Настройка формы django на основе зарегистрированного пользователя
Я дошел до того, что правильно отображал список сервисов на основе зарегистрированного пользователя, но у меня возникли проблемы с обработкой / проверкой 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, но у меня была единственная возможность правильно отобразить настройки.
Любая помощь приветствуется.