Trying to make django-mptt work with inherited models

32 views
Skip to first unread message

phoebebright

unread,
Oct 3, 2009, 1:03:53 PM10/3/09
to Django users
Have spent quite a few hours on this one but not familiar enough with
django inerds to make much progress.

Here is the model:

class Stuff(models.Model):
name = models.CharField(max_length=140)
parent = models.ForeignKey('self', null=True, blank=True,
related_name='children')

mptt.register(Stuff)

class ToDo(Stuff):
status = models.CharField(_('status'), max_length=1,
choices=STATUS_CHOICES, default=1)

class Concept(Stuff):
priority = models.CharField(_('status'), max_length=1,
choices=PRIORITY_CHOICES,
default='C')


And the code where I am saving (tried many different options!)

obj = ToDo(**field_vals)
obj.tags = " ".join(set(self.keyw_used))
obj.save()

# add parent
if self.parent:
obj.move_to(self.parent)

obj.save()

Am getting the error 'Options' object has no attribute 'parent_attr'
when trying to add to ToDo.
Error occurring here:
def is_root_node(self):
return getattr(self, '%s_id' % self._meta.parent_attr) is None

This is because the ToDo model is not in the mptt registery.

I tried adding an attribute to register to say it was inherited so
that the __init__ method of mptt would add the ToDo and Concept models
to the registry but not all the fields. ie.

in models:
mptt.register(Stuff)
mptt.register(ToDo, inherited=True)
mptt.register(Concept, inherited=True)

and hacked __init__:

if model in registry:
raise AlreadyRegistered(
_('The model %s has already been registered.') %
model.__name__)
registry.append(model)

#added by PHB
if not inherited:

# Add tree options to the model's Options
opts = model._meta
opts.parent_attr = parent_attr
opts.right_attr = right_attr


This got me past the first error but it's still putting the mptt
fields in the _meta of the ToDo model and failing in the models
pre_save with:

AttributeError: 'ToDo' object has no attribute 'lft'


I need to find some way of telling django these fields are in the
parent class and not the child. Any suggestions very welcome as way
out of my depth there!



Reply all
Reply to author
Forward
0 new messages