Frank,

your snippet works great. I just removed the int conversion on
bf_data, since I want to have f.is_valid() = false if the user submits
something different than an integer.

Without you I would never be able to solve the problem.

Thanks a lot.

On 11 Ott, 09:51, pinco <[EMAIL PROTECTED]> wrote:
> Great!
>
> Thank you very much Frank.
>
> On 10 Ott, 22:03, FrankW <[EMAIL PROTECTED]> wrote:
>
>
>
> > I would swear that I posted a response to this earlier today, but it
> > doesn't seem to show up in the group.  The problem you're having is
> > because of the 'cart_item_' that you are adding in. It is not being
> > added into the dictionary that is assigned to the form's data.
>
> > >>> f.fields
>
> > {'cart_item_a': <django.newforms.fields.IntegerField object at
> > 0x01423130>, 'cart_item_b': <django.newforms.fields.IntegerField
> > object at 0x01423190>}>>> f.data
>
> > {'a': '1', 'b': '2'}
>
> > The validation logic checks against f.data, and doesn't find
> > 'cart_item_a' as a key.  Try this instead:
>
> > >>> class CartForm(forms.Form):
>
> > ...         def __init__(self, a):
> > ...                 super(CartForm, self).__init__(a)
> > ...                 for key in a.keys():
> > ...                         self.fields[str(key)] =
> > forms.IntegerField(required  = True)
> > ...                         self.fields[str(key)].bf =
> > forms.forms.BoundField(self, self.fields[str(key)], str(key))
> > ...                         self.fields[str(key)].bf._data =
> > int(a[key])
> > ...                 return
> > ...
>
> > >>> j = CartForm({'a':'1','b':'2'})
> > >>> j.is_valid()
>
> > On Oct 8, 6:19 pm, pinco <[EMAIL PROTECTED]> wrote:
>
> > > Frank,
> > > thak you for your help.
>
> > > I worked on the form model using bound field, and now the forms is
> > > bound.
>
> > > class CartForm(forms.Form):
> > >         def __init__(self, a):
> > >                 super(CartForm, self).__init__(a)
> > >                 for key in a.keys():
> > >                         self.fields['cart_item_' + str(key)] = 
> > > forms.IntegerField(required
> > > = True)
> > >                         self.fields['cart_item_' + str(key)].bf = 
> > > BoundField(self,
> > > self.fields['cart_item_' + str(key)], 'cart_item_' + str(key))
> > >                         self.fields['cart_item_' + str(key)].bf._data = 
> > > int(a[key])
> > >                 return
>
> > > However, I still have some problems.
> > > 1- I don't understand how the form validates:
>
> > > >>> f = CartForm({'a':'1', 'b':'2'})
> > > >>> f.is_bound
> > > True
> > > >>> f.is_valid()
> > > False
> > > >>> k = CartForm({'a':1, 'b':2})
> > > >>> k.is_bound
> > > True
> > > >>> k.is_valid()
>
> > > False
>
> > > I supposed the first one validation to be false since the field widget
> > > is an IntegerField.
>
> > > 2 - I'm not able to figure out to read the form after it has been
> > > posted.
>
> > > Can you help me?
>
> > > Many thanks
>
> > > On 7 Ott, 02:45, FrankW <[EMAIL PROTECTED]> wrote:
>
> > > > In your example,
> > > >     self.fields[str(key)]=forms.CharField(initial=c[key])
> > > > isn't doing what you expect.
>
> > > > You are setting the initial attribute of a field, not creating
> > > > a BoundField. See django/newforms/forms.py, and look at the
> > > > comments for BaseForm and Form and the code for
> > > > BoundField.
>
> > > > On Oct 6, 8:31 am, pinco <[EMAIL PROTECTED]> wrote:
>
> > > > > Hi,
>
> > > > > I'm trying to figure out how to build a form to display x fields,
> > > > > where x is determined at runtime (e.g. a form to update the quantities
> > > > > of all the items in a shopping cart).
>
> > > > > My model is:
>
> > > > > class CartForm(forms.Form):
>
> > > > >         def __init__(self, c, *args, **kwargs):
> > > > >                 super(CartForm, self).__init__(*args, **kwargs)
> > > > >               # c is a dictionary containing cart items
> > > > >                 for key in c.keys():
> > > > >                         
> > > > > self.fields[str(key)]=forms.CharField(initial=c[key])
> > > > >                 return
>
> > > > > My view is:
>
> > > > > def show_cart(request):
> > > > >         cart = Cart.objects.get(pk=request.session.get('cart_id', 
> > > > > None))
> > > > >         cart_items = cart.cartitem_set.all() #Just to avoid two hits 
> > > > > for the
> > > > > same info
> > > > >         form = CartForm(c=create_cart_dictionary(cart_items))
> > > > >         return render_to_response('show_cart3.html', {'cart': cart,
> > > > > 'num_items': cart.no_items, 'cart_items': cart_items, 'form':form})
>
> > > > > def update_quantity(request):
>
> > > > >         if request.method == 'POST':
> > > > >                 cart = 
> > > > > Cart.objects.get(pk=request.session.get('cart_id', None))
> > > > >                 form = CartForm(request.POST)
> > > > >                         #old_quantity =item.quantity
> > > > >                 if form.is_valid():
> > > > >                         for item in cart.cartitem_set.all():
> > > > >                                 itemid = item.id
> > > > >                                 new_quantity = 
> > > > > form.cleaned_data['cart_item' + str(itemid)]
> > > > > ... save the new quantities
>
> > > > > Create_cart_dictionary is a function that create a dictionary like
> > > > > {'item_id': item}.
>
> > > > > show_cart() works as expected, since it displays a dynamically
> > > > > generated form with fields named by the item.id displayed.
>
> > > > > update_quantity() do not works, since form.is_valid() is always false:
>
> > > > > >>> form = CartForm({'a': 10, 'b':20})
> > > > > >>> form
>
> > > > > <sensfly.carts.models.CartForm object at 0x13bce70>>>> form.is_valid()
> > > > > False
> > > > > >>> form = CartForm({'a': '10', 'b':'20'})
> > > > > >>> form.is_valid()
> > > > > False
> > > > > >>> print form
>
> > > > > <tr><th><label for="id_a">A:</label></th><td><input type="text"
> > > > > name="a" value="10" id="id_a" /></td></tr>
> > > > > <tr><th><label for="id_b">B:</label></th><td><input type="text"
> > > > > name="b" value="20" id="id_b" /></td></tr>>>> form.is_bound
>
> > > > > False
>
> > > > > The problems seems to be that the form is not bound.
> > > > > What I'm doing wrong? How to bound and validate the dynamically
> > > > > generated form?- Nascondi testo tra virgolette -
>
> > - Mostra testo tra virgolette -- Nascondi testo tra virgolette -
>
> - Mostra testo tra virgolette -


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to