Hey all, Been trying to display multiple form rows for a project lately, and I just wanted to confirm that I'm doing this right. I found a solution on http://www.pointy-stick.com/blog/2009/01/23/advanced-formset-usage-django/ , and I took what I needed from it (my code below), but I found that whenever I passed in my request.POST data it was getting overwritten by the users and resource data. So then I in checks for data and try statements to make sure everything was going where it should. Everything works now, but I'm not sure if I'm leaving some sort of important edge case unattended too, or what. So my question is: is the way that I'm handling errors here the correct way of doing multiple form rows? And if not, why not? Surprise, I'm new to both Python and Django, which is why I want to make sure I'm doing this both "django"- ly and "pythonic"-ly.
#VIEW @login_required def manage_roles(request, resource_id): resource = get_object_or_404(Lock, pk=resource_id) if(request.method == "POST"): formset = create_roles_formset(resource, request.POST) if formset.is_valid(): for form in formset.forms: #Haven't actually hooked up the templates and success logic yet. print form.cleaned_data['role'] print form.cleaned_data['user'] print '-' else: formset = create_roles_formset(resource) dictToSend['rolesForm'] = formset dictToSend['resource'] = resource return render_to_response('locks/manage_roles.html', dictToSend, context_instance=RequestContext(request)) def create_roles_formset(resource, data=None): users = User.objects.filter(lockmembership__lock=resource) if not users: raise Http404('Invalid user id(s)') ResourceFormset = formsets.formset_factory(ResourceRoleForm, ResourceRolesFormset) if not data: return ResourceFormset(data, users=users, resource=resource) else: return ResourceFormset(data) #FORMS class ResourceRolesFormset(formsets.BaseFormSet): def __init__(self, *args, **kwargs): if 'resource' in kwargs and 'users' in kwargs: self.resource = kwargs.pop("resource") self.users = list(kwargs.pop("users")) self.extra = len(self.users) super(ResourceRolesFormset, self).__init__(*args, **kwargs) def _construct_form(self, i, **kwargs): try: kwargs["user"] = self.users[i] kwargs["resource"] = self.resource except AttributeError: pass return super(ResourceRolesFormset, self)._construct_form(i, **kwargs) class ResourceRoleForm(forms.Form): role = forms.ChoiceField(widget=forms.Select, choices=LockMembership.LOCK_ROLES) user = forms.IntegerField(widget=forms.HiddenInput) def __init__(self, *args, **kwargs): print kwargs try: resource = kwargs.pop("resource") user = kwargs.pop("user") except KeyError: pass super(ResourceRoleForm, self).__init__(*args, **kwargs) try: lm = LockMembership.objects.filter(lock=resource, user=user)[0] self.fields['role'].initial = lm.role self.fields['role'].label = user.username self.fields['user'].initial = user.id except KeyError: pass except UnboundLocalError: pass --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---