Отклонение частично заполненной формы в ModelFormSet с полем ManytoMany

У меня есть Modelformset, который содержит множество полей. Поле M2M отображается как ModelMultipleChoiceField.

Все это прекрасно работает, когда все формы заполнены.

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

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

Мне удалось заставить частично заполненные формы пройти проверку, чтобы все формы были сохранены, но мне трудно написать тест, который отбрасывал бы частично заполненную форму (из которой не выбраны флажки).

Models.py

    customer_id = models.ForeignKey(CustomerDB, on_delete=models.CASCADE, default=None)
    services_manytomany = models.ManyToManyField(ContractorServices, blank=True)

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)
    archive = models.BooleanField(default=False, null=True)

    def __str__(self):
        return self.service_name

forms.py

    services_manytomany = forms.ModelMultipleChoiceField(
        widget=forms.CheckboxSelectMultiple,
        queryset=ContractorServices.objects.all()
    )

    def __init__(self, user, *args, **kwargs):
        super(AddJob, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_show_labels = False
        self.helper.form_show_errors = True
        self.helper.form_tag = False
        self.fields['services_manytomany'].required = False

        if user is not None:
            self.fields['services_manytomany'].queryset = ContractorServices.objects.filter(service_parent=user)

    class Meta:
        model = Jobs_DB
        fields = {'services_manytomany', 'frequency'}

Соответствующий код view.py


    formset = job_formset(queryset=Jobs_DB.objects.none(), form_kwargs={'user': request.user})

    if request.method == 'POST':
        form_a = AddJob(request.user, request.POST)
        formset = job_formset(request.POST, form_kwargs={'user': request.user})
        if formset.is_valid():
            instances = formset.save(commit=False)
            for instance in instances:
                instance.customer_id = CustomerDB.objects.get(pk=customer_id)
                instance.save()
            formset.save_m2m()

0 ответов

Другие вопросы по тегам