it seems that inline-formsets will do the job. something related to models.BaseInlineFormSet and models.inlineformset_factory.
http://code.google.com/p/django-dynamic-formset/ I'm still studying the code. :P regards. --------- On 6 abr, 16:09, Cesar Devera <cesardev...@gmail.com> wrote: > hi. imagine following scenario: > > #-------------------------------------------------------------- > from django.db import models > from django.forms.models import ModelForm > > # ignore this Sample for now. focus on Master and Detail > class Sample(models.Model): > foo = CharField() > > class Master(models.Model): > field1 = models.CharField() > field2 = models.CharField() > samples = models. ManyToManyField(Sample) > > class Detail(models.Model): > attr1 = models.CharField() > attr2 = models.CharField() > master = models.ForeignKey(Master) > > class MasterDetailForm(ModelForm): > class Meta: > model = Master / > #-------------------------------------------------------------- > > I plan to write a dynamic (javascript powered) HTML page, that will > show a form with the Master fields at the top, and will allow the user > to add several Details on demand, by appending elements to the DOM > (with javascript). > > I already have something like this for Many-to-Many fields (for the > Sample model, for example): the user presses an Add button, the app > shows him a popup, he selects the option he wants, and by javascript I > add a new [input hidden] field to the DOM with the ID of the option > choosen. when the form is submitted, django transparently handles the > several hidden ID's from the request, and does his magic mapping the > M2M relationship. it works perfectly. > > but now, I cannot just use hidden ID's. I need several complete > entities shown on screen. > I need the user to fill them, and submit everything at once. > > imagine you have a Sales screen, where the user (salesman) types the > Customer Info (master/header) and also add (javascript magic) the sold > items (details), typing their codes, quantities and prices, and only > at the end he submits the form. > > so, the question, after all, is: how should be my HTML/DOM, and how > should I prepare my modelForm so Django would be able to parse the > request and give me a complete Master entity with Detail entities > inside? > > I don't need the javascripts (no problems with js), I just need to > know, for example, if an array of the fields of my Detail model would > be the correct approach. for example: > > <form method=post ...> > Master fields: > <input type=text name=field1 /> > <input type=text name=field2 /> > > Multiple details: > <input type=text name=attr1 /> > <input type=text name=attr2 /> > <input type=text name=attr1 /> > <input type=text name=attr2 /> > <input type=text name=attr1 /> > <input type=text name=attr2 /> > > <input type=submit /> > </form> > > is there a way for Django to parse such POST and give me a Master > entity with 3 Details inside? > > if it is not possible, I will have to get only the Master from the > POST and handle the Details by hand, like this: > > if request.method == 'POST': > form = MasterModelForm(request.POST) > if form.is_valid(): > master = form.save() > for i in range(len(request.POST['attr1'])): > detail = Detail() > detail.attr1 = request.POST['attr1'][i] > detail.attr2 = request.POST['attr2'][i] > detail.master = master > detail.save() > > or something like this. > > is there any better ideia? > > thanks in advance. > > p.s.: as you could see, I don't worry to write the html by hand. I > don't want to use form.as_p() or something. I just need to get the > form from the request, like in form = > MasterDetailModelForm(request.POST). thanks again. > > p.s.2: I wonder if a formset could help here. -- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-us...@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.