Well... Problem closed. I was trying to override things that I
shouldn't. Now I got the idea of returning manager by __get__ and
everything is just fine :)

On Jun 27, 11:13 pm, Vladimir Shulyak <nc0...@gmail.com> wrote:
> Hello,
>
> I am trying to develop sublcass of models.ManyToManyField. This class
> should return text representations of objects to forms.TextField (like
> TagField from django-tagging). The reason to make my own
> representation is because:
> - I don't need content types
> - I need "front face" to ManyToManyField, but TagField uses CharField
> and stores duplicate data.
>
> So I come to implementing my own descriptor and field like this
> (minimal code just to show exception, dpaste of same code for syntax
> highlightinghttp://dpaste.com/60470/):
>
> #descriptor of field
> class MultiModelSubclassDescriptor
> (ReverseManyRelatedObjectsDescriptor):
>
>     def __init__(self, m2m_field):
>         super(MultiModelSubclassDescriptor, self).__init__(m2m_field)
>
>     def __get__(self, instance, instance_type=None):
>         from products.models import Ingridient
>         return ", ".join(["%s" % ing.name for ing in
> Ingridient.objects.all()])
>         #super(MultiModelSubclassDescriptor, self).__get__(instance,
> instance_type)
>
>     def __set__(self, instance, value):
>         pass
>         #super(MultiModelSubclassDescriptor, self).__set__(instance,
> value)
>
> #field
> class MultiModelSubclassField(ManyToManyField):
>
>     def __init__(self, to, **kwargs):
>         super(MultiModelSubclassField, self).__init__(to, **kwargs)
>
>     def contribute_to_class(self, cls, name):
>         super(MultiModelSubclassField, self).contribute_to_class(cls,
> name)
>
>         # Make this object the descriptor for field access.
>         setattr(cls, self.name, MultiModelSubclassDescriptor(self))
>
>     def value_from_object(self, obj):
>         "Returns the value of this field in the given model instance."
>         return getattr(obj, self.attname) #original getattr(obj,
> self.attname).all() for queryset
>
>     def formfield(self, **kwargs):
>         f = FormCharField(widget = TextInput())
>         return f
>
> But as my field is a subclass of ManyToManyField, django tries to get
> PKs of my object, not value.
> Piece of django code which is responsible for it:
>
>     for f in opts.fields + opts.many_to_many:
>         if not f.editable:
>             continue
>         if fields and not f.name in fields:
>             continue
>         if exclude and f.name in exclude:
>             continue
>         if isinstance(f, ManyToManyField):
>             # If the object doesn't have a primry key yet, just use an
> empty
>             # list for its m2m fields. Calling f.value_from_object
> will raise
>             # an exception.
>             if instance.pk is None:
>                 data[f.name] = []
>             else:
>                 # MultipleChoiceWidget needs a list of pks, not object
> instances.
>                 data[f.name] = [obj.pk for obj in f.value_from_object
> (instance)] """ HERE I get exception """
>
>         else:
>             data[f.name] = f.value_from_object(instance)
>
> There is a hack I to overcome this I beleive...
>
> Any help much appreciated, I am fighting with it for 4 days...
> Thanks.
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to