El jueves, 26 de abril de 2012, 8:25:42 (UTC+2), Martin Tiršel escribió:
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.MartinOn 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...@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...@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...@googlegroups.com.
> To unsubscribe from this group, send email to
> django-users...@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 unsubscribe from this group and stop receiving emails from it, send an email to django-users+unsubscribe@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/443574b0-cabc-44ac-8d28-02f2ae74423a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
No comments:
Post a Comment