On 28    ., 05:56, "Jeremy Dunck" <[EMAIL PROTECTED]> wrote:
On 12/27/06, Vasily Sulatskov <[EMAIL PROTECTED]> wrote:





> I have models similar to following:

> class User(models.Model):
>     name = models.CharField(maxlength=100)

> class Keyword(models.Model):
>     name = models.CharField(maxlength=100)
>     user = models.ForeignKey(User)

> class Article(models.Model):
>     name = models.CharField(maxlength=100)
>     user = models.ForeignKey(User)
>     keywords = model.ManyToManyField(Keyword,
> filter_interface=models.HORIZONTAL)

> Admin works but displays on Article edit page Keywords of all users,
> while I want it to display Keywords only of the same User only.This isn't 
exactly what you asked for, but perhaps it'll 
help:http://code.djangoproject.com/wiki/CookBookPredicates

Thanks for the reply but that didn't help.

I find a workaround for this problem, imho it's even clunky enough to
be called kludge :-)

class RelatedManyToManyField(models.ManyToManyField):
   def __init__(self, *args, **kwds):
       self.related_set_name = kwds.pop('related_set_name')
       self.__manipulator = None

       models.ManyToManyField.__init__(self, *args, **kwds)

   def get_manipulator_fields(self, opts, manipulator, change,
       name_prefix='', rel=False, follow=True):
       self.__manipulator = manipulator
       return super(RelatedManyToManyField,
self).get_manipulator_fields(
           opts, manipulator, change, name_prefix, rel, follow)

   def get_choices_default(self):
       if hasattr(self.__manipulator, 'original_object'):
           profile = self.__manipulator.original_object.user_profile
           objects = list(getattr(profile,
self.related_set_name).all())
           choices = [(obj.id, str(obj)) for obj in objects]
       else:
           # Fallback for AddManipulator case

           # Possible solution
           #choices = models.Field.get_choices(self,
include_blank=False)

           # I dont't want any choices until object is fully created
           choices = []
       self.__manipulator = None
       return choices

I examinded calls django makes during form creation and find out that
call to get_manipulator_fields() is the last call which have
information about manipulator it's related to and therefore can access
it's original_object. So I overrided get_manipulator_fields() to store
manipulator and used that information in get_choices_default().

It works for me.

Is there any better solution?

Or perhaps it's possible to improve this solution to the point it will
make way to mainline Django?


--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to