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 <aa56280@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+unsubscribe@googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
>
>
--
Ian
--
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+unsubscribe@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-users?hl=en.
No comments:
Post a Comment