On Wed, Jul 9, 2008 at 12:57 AM, ristretto.rb <[EMAIL PROTECTED]>
wrote:

> I'm using the svn version.  I updated this morning.  I can't remember
> if I was getting the error before I updated, or not.
>

That ticket I pointed to identifies r7710 as a revision where this problem
did not exist.  With your models (much simpler than the ones in that ticket)
I was able to recreate the problem on r7871. Binary search shows that the
problem was introduced in r7790:

http://code.djangoproject.com/changeset/7790

The change message says it was to "Make sure we only create the minimum
number of table indexes for MySQL" but I don't believe this problem has
anything to do with creating table indexes.  (I did not recreate the tables
when recreating the problem, just attempted to "save and continue editing" a
problematic entry.)

I have spent the day tracking this down (it's taken me all day because
> I don't know Django or Python very well, and I haven't been able to
> find a comprehensive IDE that is worth much more then just an editor.
> Argh.)
>

Well you picked some hairy code to start with.  FWIW I use Eclipse with
PyDev which is good enough for stepping through code, setting breakpoints,
and examining variables, though it can run into problems with side-effects
of the variable display.  For getting some clue about what code path is
running it's usually OK enough.

In any case, here's what I'm up to
>
> In django-trunk/django/oldforms/__init__.py line around 68, I have put
> some logging output.  field.get_validation_errors(new_data) is coming
> back as a oldforms.HiddenField when it generated the following error.
>
> 2008-07-09 04:03:08,227 DEBUG <class 'django.oldforms.HiddenField'>
> 2008-07-09 04:03:08,227 DEBUG {'jointable.0.id': [u'Join table with
> this ID already exists.']}
>
> I don't know why the admin system needs to put this following hidden
> in the html
>
>           <input type="hidden" id="id_jointable.0.id"
> name="jointtable.0.id" value="38" />
>

That's the primary key value of the inline-edited object.  When the admin
code needs to update any of the visible fields, it needs to pull the primary
key value out of the hidden field in order to know the correct record to
update.


> Now, I've traced this down to line 474, roughly of django-trunk/django/
> oldforms/__init__.py where a the HiddenField class is defined.  A
> validator is passed in called "_curried".  I have no idea what that
> is.  Going to stop here.
>

Yeah, the problem is that validator.  Prior to r7790, these hidden fields
did not have any validators attached to them.  Now they have the
manipulator_validator_unique validator that is run.  Problem is this
validator doesn't seem to be appropriate for this case.  Tracing through it
it is looking up the inline edited object's primary key value in the parent
object's table and if it exists comparing it to the parent object's original
primary key value, so you get an error if the primary key value for the
inline edited object exists in the parent object's table and differs from
the parent primary key value.  I don't believe that validator is supposed to
be associated with the hidden input field for the primary key of an
inline-edited object.

It's being added here:

(
http://code.djangoproject.com/browser/django/trunk/django/db/models/fields/__init__.py#L329
)

        if self.unique or (self.primary_key and not rel):

params['validator_list'].append(curry(manipulator_validator_unique, self,
opts, manipulator))

which points to the changes associated with setting unique in r7790 as what
has introduced the problem.  I don't understand exactly what that change was
supposed to be doing, so I'm not sure what the right fix is.  I'll update
#7682 with what I've figured out and hopefully someone who knows the code
can fix it.  In the meantime if you drop back to r7789 I think you will find
the problem goes away.

Karen


>
> On Jul 9, 2:47 pm, "Karen Tracey" <[EMAIL PROTECTED]> wrote:
> > On Tue, Jul 8, 2008 at 9:57 PM, ristretto.rb <[EMAIL PROTECTED]>
> wrote:
> >
> > > More details.  I'm using MySQL at the moment (but with a plan to move
> > > to Postgresql.)  The association table has a number of rows loaded
> > > through these models, but not through my Django app directly.  I used
> > > the Model classes in a script to pre load a bunch of data.  Could this
> > > be the problem?
> >
> > > On Jul 9, 1:28 pm, ristretto.rb <[EMAIL PROTECTED]> wrote:
> > > > OK, I took core=True off, and added it to the reference_no field.
>  The
> > > > problem seems to go away for the case when no there are no
> > > > pre-existing joins.   Clearly, I don't understand what core is for.
> > > > I'll read the docs again, and see if it makes sense.
> >
> > > > However, it still errors with
> >
> > > > {'jointable.0.id': [u'Join Table record with this ID already
> exists.']}
> >
> > > > when I tried to save a LeftSide records with existing associations.
> >
> > > > thanks for any and all help.
> >
> > I have no idea what is going on, but a ticket was recently (4 hours ago)
> > opened reporting the same error message for inline-edited objects:
> >
> > http://code.djangoproject.com/ticket/7682
> >
> > It seems like some code is thinking records are supposed to be new and
> > checking for primary key uniqueness when in fact it is existing records
> that
> > are being updated.  This might be a recently introduced bug, it's a
> little
> > curious to have two people reporting the same (not common) error message
> > suddenly so close together.
> >
> > What version are you running?
> >
> > Karen
> >
> >
> >
> > > > On Wed, Jul 9, 2008 at 1:09 PM, ristretto. rb <
> [EMAIL PROTECTED]>
> > > wrote:
> > > > > Hello, I'm stuck.  Any help will be much appreciated.
> >
> > > > > I followed
> > > > >
> http://www.djangoproject.com/documentation/models/m2m_intermediary/to...
> > > > > a
> > > > > Many-to-many relationship via an intermediary table.
> >
> > > > > class LeftSide(models.Model):
> > > > > :
> >
> > > > > class RightSide(models.Model):
> > > > > :
> >
> > > > > class JoinTable(models.Model):
> > > > >     leftSide = models.ForeignKey(LeftSide,
> > > > >                 edit_inline=models.TABULAR,
> > > > >                 num_in_admin=3, core=True)
> > > > >     rightSide = models.ForeignKey(RightSide,
> > > > >                 edit_inline=models.TABULAR,
> > > > >                 num_in_admin=3,core=True)
> > > > >     reference_no = models.CharField(max_length=10, null=True,
> > > blank=True)
> >
> > > > > I can load the LeftSide in the admin, and choose to Change a
> record.  I
> > > get
> > > > > 3 RightSide menu groups at the bottom.  I can choose a RightSide to
> set
> > > as a
> > > > > join.  When I choose Save (any of the 3 save variations on the
> page)
> > > nothing
> > > > > is saved.
> >
> > > > > There are two cases.
> >
> > > > > 1)  If the are already records in the join table for that LeftSide,
> > > then I
> > > > > get an error when I save.  {'jointable.0.id': [u'Join Table record
> > > with this
> > > > > ID already exists.']}  I didn't actually make any changes to that
> > > > > association, so I don't know why it would complain.
> >
> > > > > 2)  If there are no join table records associated with the
> LeftSide,
> > > then
> > > > > there is no error, but nothing is saved.
> >
> > > > > Am I doing something totally wrong here?  Or is this a bug in the
> Admin
> > > > > system?
> >
>

--~--~---------~--~----~------------~-------~--~----~
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 [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to