Django не очищает() набор форм
У меня есть три модели:
class Order(models.Model):
...
class Job(models.Model):
...
class Item(models.Model): // Creates a record of a job for the order
order = models.ForeignKey(
Order,
on_delete=models.CASCADE,
blank=True,
)
job = models.ForeignKey(
Job,
on_delete=models.CASCADE,
)
I am using a modified UpdateView
to update the Order
:
def get_job_forms(order, data=None):
"" Takes order instance and creates a formset for it from Items""
JobModelFormset = modelformset_factory(
Item,
form=ItemForm,
fields='__all__',
formset=BaseModelFormSet,
)
qs = order.item_set.all()
return JobModelFormset(data, queryset=qs)
class ObjectView(UpdateView):
"" CreateView if called with is_create=True, else UpdateView""
is_create = False
def get_object(self, queryset=None):
try:
return super().get_object(queryset)
except AttributeError:
return None
class OrderUpdateView(WriteCheckMixin, ObjectView):
model = Order
form_class = OrderForm
def form_valid(self, form):
self.object = form.save()
if not self.is_create:
formset = get_job_forms(self.object, self.request.POST)
if formset.is_valid():
for f in formset:
inst = f.save(commit=False)
inst.order = self.object
inst.save()
else:
return self.render_to_response(
self.get_context_data(form=form, formset=formset))
return redirect(self.object.get_absolute_url())
def get_context_data(self, *args, formset=None, **kwargs):
context = super().get_context_data(*args, **kwargs)
order = self.get_object()
context['formset'] = formset if formset else get_job_forms(order)
return context
When I call UpdateView
it renders the template with one empty formset, like you would expect it. But if I call POST
on the formset, formset.is_valid()
returns True
even if all the fields are empty. If I allow null
values on the Item's fields, it would save an instance with empty fields, even though blank
is set to False
. What am I missing? Why doesn't it perform clean()
on the formset.
class ItemForm(FormMixin):
class Meta:
model = Item
fields = '__all__'
<form method='post' id="data_form">
{% csrf_token %}
{{ form.as_p}}
<p> Jobs: </p>
{{ formset.management_form }}
<table>
<tbody>
{% for form in formset %}
<tr>
<td> {{ form.job }}{{ form.job.errors }}</td>
</tr>
{{ form.id }}
{{ form.non_field_errors }}
{% endfor %}
</tbody>
</table>
{{ formset.non_form_errors }}
</form>