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? --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com 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 -~----------~----~----~----~------~----~------~--~---