Получение значений из флажков ModelMultipleChoiceField - PullRequest
0 голосов
/ 07 июня 2019

Большая картина: В конечном счете, я понятия не имею, правильно ли я подошел к этому, но это настолько далеко, насколько я понял.

Я создаю платформу для поставщиков услуг по уходу за газонами. Каждая компания может предлагать различные услуги, поэтому я устанавливаю модель, которая позволяет каждому поставщику услуг создавать свои собственные услуги.

Когда поставщик услуг назначает встречу для своего клиента, я хочу, чтобы он мог выбирать из списка флажков.

Я частично ссылался на эту тему, чтобы получить доступ к отображаемым записям пользователей. Настройка формы django на основе зарегистрированного пользователя

Я дошел до того, что правильно отображал список сервисов на основе зарегистрированного пользователя, но у меня возникли проблемы с обработкой / проверкой 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, но у меня была единственная возможность правильно отобразить настройки.

Любая помощь приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...