У меня есть 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()