Отклонение частично заполненной формы в 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()