I am fairly new and using Django Admin to manage a set of lists and forms for a database GUI. I am not happy with the performance rendering a form which has foreignkey fields or manytomany fields with numerous values. This inspired me to get involved with overloading "formfield_for_foreignkey" which I eventually managed. When I went to tackle a "manytomany" formfield for an 'inline' the "admin" doco says "use 'formfield_for_manytomany' as usual, so I created the approriate method in the 'inline' Class but it was never invoked. Numerous clever workarounds are given in the forums but I decided to try using "formfield_for_manytomany" in the inline class. This works brilliantly. I guess the principle is that within the "through" model, the fields are actually "foreignkey" fields, and the 'db_field.name' values correspond to that model.
Here is a fragment of code where I cache the queryset for multiple fields in the session dictionary. #--------------------------------------------- # use inline feature in Route for Points and Tracks class PointsInline(TabularInline): model = Route.points.through extra = 0 class TracksInline(TabularInline): def formfield_for_foreignkey( self,db_field, request, **kwargs): if db_field.name == "track_id" or db_field.name == "point_id": url_split = request.path.split('/') route_id = url_split[-2] try: previous_id = request.session.get("RouteId") except: previous_id = None if route_id <> previous_id : print db_field.name, request.path, "\n" request.session["RouteId"] = route_id q_line = Route.objects.get(id=route_id).from_signal.location.line tq_set = Track.objects.filter(location__line=q_line) request.session["TrackList"] = tq_set pq_set = Point.objects.filter(location__line=q_line) request.session["PointList"] = pq_set print q_line, tq_set.count(), pq_set.count() if db_field.name == "track_id": q_set = request.session["TrackList"] else: q_set = request.session["PointList"] kwargs["queryset"] = q_set return super(TracksInline, self).formfield_for_foreignkey(db_field, request, **kwargs ) else: return None model = Route.tracks.through extra = 0 class RouteAdmin(ModelAdmin): inlines = [ PointsInline, TracksInline ] list_per_page = 48 list_display = ('__unicode__','from_signal','to_signal','direction') list_filter= ('to_signal__location__line',) exclude = ('tracks','points',) search_fields = ('to_signal__location__vcode','from_signal__location__vcode',) #--------------------------------------------- -- 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.