Thanks, form.has_changed() seems to be the way. But I don't understand the empty_permitted attribute, it is usable only with ModelForm? I am using the formset only for mass form processing not for inserting/updating models.
Martin On Wednesday, April 25, 2012 2:35:20 PM UTC+2, Tom Evans wrote: > > Hmm. Internally, model formsets do this differently - they are aware > of which forms are extra forms, and which forms are existing forms. > > New forms will have form.empty_permitted=True, unmodified forms will > return True from form.has_changed(). This should be enough to skip > over blank new forms. > > Cheers > > Tom > > On Wed, Apr 25, 2012 at 12:55 PM, Martin Tiršel <martin.tir...@gmail.com> > wrote: > > I am using class based views and my code is: > > > > class PayOrdersView(AdminFormSetView): > > form_class = PayOrderForm > > template_name = 'internal/orders/pay_orders_form.html' > > active_item = 'order_pay_orders' > > context_formset_name = 'pay_orders_formset' > > extra = 2 > > > > def formset_valid(self, formset): > > logger.debug('Executing formset_valid') > > for form in formset: > > logger.debug('Is empty: %s' % form.empty_permitted) > > form.save() > > return super(PayOrdersView, self).formset_valid(formset) > > > > > > formset_valid method is called after formset.is_valid(). I start with 2 > > empty forms, I insert into first form order number and the second form > stays > > empty. After I submit, I get: > > > > [2012-04-25 13:42:07,776] DEBUG [31099 140249342375680] > > [project.internal.mixins:304] Processing POSTed form > > [2012-04-25 13:42:07,778] DEBUG [31099 140249342375680] > > [project.internal.forms:29] Cleaning order_number > > [2012-04-25 13:42:07,837] DEBUG [31099 140249342375680] > > [project.internal.mixins:307] Formset is valid > > [2012-04-25 13:42:07,842] DEBUG [31099 140249342375680] > > [project.internal.views:93] Executing formset_valid > > [2012-04-25 13:42:07,843] DEBUG [31099 140249342375680] > > [project.internal.views:95] Is empty: True > > [2012-04-25 13:42:07,843] DEBUG [31099 140249342375680] > > [project.internal.forms:54] Saving PayOrderForm > > [2012-04-25 13:42:09,914] DEBUG [31099 140249342375680] > > [project.internal.views:95] Is empty: True > > [2012-04-25 13:42:09,914] DEBUG [31099 140249342375680] > > [project.internal.forms:54] Saving PayOrderForm > > > > So both forms have empty_permitted == True. Management form in time of > > submit looks so: > > > > <input id="id_form-TOTAL_FORMS" type="hidden" value="2" > > name="form-TOTAL_FORMS"> > > <input id="id_form-INITIAL_FORMS" type="hidden" value="0" > > name="form-INITIAL_FORMS"> > > <input id="id_form-MAX_NUM_FORMS" type="hidden" > name="form-MAX_NUM_FORMS"> > > > > Thanks, Martin > > > > On Wednesday, April 25, 2012 11:03:49 AM UTC+2, Tom Evans wrote: > >> > >> On Sun, Apr 22, 2012 at 5:44 PM, Martin Tiršel <martin.tir...@gmail.com > > > >> wrote: > >> > Hello, > >> > > >> > I have a formset and some JavaScript to add more forms into this > >> > formset. In > >> > a view, I iterate through the formset saving (not a ModelForm just > Form > >> > with > >> > save method) each form: > >> > > >> > for form in formset: > >> > form.save() > >> > > >> > But I want to ignore empty forms that were added by JavasScript and > not > >> > removed. How can I do this? > >> > > >> > Thanks, > >> > Martin > >> > > >> > >> You don't show much of your code, but I presume you have called > >> formset.is_valid() at this point? > >> > >> If so, this pattern is pretty canonical: > >> > >> if formset.is_valid(): > >> for form in formset: > >> if form.is_valid() and not form.empty_permitted: > >> form.save() > >> > >> Extra forms in a formset are all instantiated with empty_permitted=True. > >> > >> There are other things to be aware of though. This logic will not take > >> into account deleted forms etc, which is why there is a > >> BaseModelFormSet with the right behaviour baked into it's save() > >> method. > >> > >> Cheers > >> > >> Tom > > > > -- > > You received this message because you are subscribed to the Google Groups > > "Django users" group. > > To view this discussion on the web visit > > https://groups.google.com/d/msg/django-users/-/aKliGdMNqGwJ. > > > > To post to this group, send email to django-users@googlegroups.com. > > To unsubscribe from this group, send email to > > django-users+unsubscr...@googlegroups.com. > > For more options, visit this group at > > http://groups.google.com/group/django-users?hl=en. > -- You received this message because you are subscribed to the Google Groups "Django users" group. To view this discussion on the web visit https://groups.google.com/d/msg/django-users/-/v6cdEoCPZbUJ. To post to this group, send email to django-users@googlegroups.com. To unsubscribe from this group, send email to django-users+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-users?hl=en.