Hi,

What you want to do here is use a Django "Formset" which contains your
ModelForms. Since you want to show one form per person
regardless of whether they are a member or not we can't use the
modelformset_factory() and will have to do some manipulation of the
initial data using the formset_factory() function instead. I haven't
actually run and tested the code below (user beware) but you'll need
to do something similar in order to do what you're describing.

See:
http://docs.djangoproject.com/en/dev/topics/forms/formsets/
http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#model-formsets

Using the Membership form (I called it MembershipForm) from the previous poster:

from django.forms.models import formset_factory

def myview(request, group_id):
    group = Group.objects.get(pk=group_id)

    MembershipFormset = formset_factory(form=MembershipForm, extra=0)
    if request.method == 'POST':
        formset = MembershipFormset(request.POST)
        if formset.is_valid():
            # since the formset itself isn't a ModelFormset
            # we need to loop over the individual ModelForms
            # and save() them.
            for form in formset.forms:
                form.save()
        # Do something
    else:

        # Make a person_id to membership mapping.
        memberships = dict(map(lambda m: (m.person_id, m),
groups.membership_set.all()))
        initial = {}
        We need to order by pk (or some other field) here so that the
form indexes match.
        for i,person in enumerate(Person.objects.all().order_by("pk")):
            prefix = form.get_default_prefix()
            membership = memberships.get(person.pk, None)

            # Here we create the initial data.
            # Add data for the each initialized form here.
            # initial data is needed for every person in order
            # to set the number of forms.
            initial.update({
                '%s-%s-person' % (prefix, i): person if membership else None,
                '%s-%s-date_joined' % (prefix, i):
membership.date_joined if membership else None,
            })
        formset = MembershipFormset(initial=initial)

    # do something


On Wed, Jan 26, 2011 at 8:46 AM, aa56280 <aa56...@gmail.com> wrote:
>> In your case it would become something like:
>>
>> class Membership(ModelForm):
>>         class Meta:
>>                 model = Membership
>>                 fields = ('person', 'date_joined')
>>                 widgets = {
>>                         'person' : CheckBox(),
>>                         'date_joined': TextInput(),
>>                 }
>
> I need a form for each person though because a Group could have many
> members.
>
> --
> 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 
> django-users+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/django-users?hl=en.
>
>



-- 
Ian

http://www.ianlewis.org/

-- 
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 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to