Thank you very much Russ. I thought I was doing something weird, but I wasn't sure (I'm very new to Django). I'll give it a shot.
-AM On Jan 5, 10:38 pm, Russell Keith-Magee <[email protected]> wrote: > On Wed, Jan 6, 2010 at 11:13 AM, Aristotle Miternan > > > > > > <[email protected]> wrote: > > Hello Karen, > > > Here is a minimal example of what I am trying to do. I am trying to > > have a save/load functionality before a user posts their information. > > This gives me an UnresolvableValidationError because the id of the > > model is undefined when I call is_valid(). I tried a workaround by > > doing: def full_validation(): pass in my model, but now the modelform > > is not saving the data to the form (although all the cleaned_data is > > there). > > > class Foo(models.Model): > > creator = models.ForeignKey(User) > > created = models.DateTimeField('date created') > > title = models.CharField( max_length=80 ) > > > class FooForm(forms.ModelForm): > > class Meta: > > model = Foo > > fields = ('title',) > > > def save(request): > > """Called when a submit button is clicked, not used for GET > > requests.""" > > def bind_instance(fooform, foo_pk): > > try: > > db_foo = Foo.objects.get(pk=foo_pk) > > fooform.just_created = False > > except Foo.DoesNotExist: > > db_foo = Foo() > > fooform.just_created = True > > fooform.instance = db_foo > > return fooform > > > if request.method == "GET": > > return ERROR_CONDITION > > > myform = FooForm( request.POST ) > > if myform.is_valid(): > > primary_key = request.session['editing_foo'] # -1 if new, > > else returns the key of the foo being edited > > fooform = bind_instance(fooform, primary_key) > > foo = fooform.save(commit=False) > > > # Title should be handled by modelform > > if fooform.just_created: > > foo.creator = request.user > > foo.created = datetime.datetime.now() > > foo.save() > > return render_to_response( 'success.html', {}, > > context_instance=RequestContext(request) ) > > > else: > > return render_to_reponse( 'sometemplate.html', { 'form' : > > myform }, context_instance=RequestContext(request) ) > > > Thanks! > > There's no bug here. It's also arguable whether you have been bitten > by a backwards incompatible change - you're relying on manipulating > the internals of a ModelForm after it has been created, and the > internals of a class aren't ever guaranteed to be backwards > compatible. > > It looks to me like you're making your life a lot more complicated > than it needs to be. Here's a cleaned up version of the same view: > > def save(request): > if request.method == "GET": > return ERROR_CONDITION > > try: > pk = request.session['editing_foo'] > db_foo = Foo.objects.get(pk=pk) > except Foo.DoesNotExist: > db_foo = Foo() > db_foo.creator = request.user > db_foo.created = datetime.datetime.now() > > myform = FooForm(instance=db_foo, data=request.POST) > if myform.is_valid(): > my_form.save() > return render_to_response('success.html', > {}, context_instance=RequestContext(request)) > > else: > return render_to_reponse('sometemplate.html', > { 'form' :myform }, > context_instance=RequestContext(request) > ) > > This is the same view, but with the ModelForm usage corrected to use > the documented API. > > Completely independent of this change, you should probably change the > 'success' render_to_response to a HttpResponseRedirect - otherwise > pressing reload on the success page will cause the form to be > resubmitted and reprocessed. > > Yours, > Russ Magee %-)
-- You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to [email protected]. 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.

