﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
2389	admin: searching in change list causes traceback when you use column sorting	Matthew Flanagan	Adrian Holovaty	"I get the following traceback when sorting the raw_id_admin popup for the Proxy model and then entering a search term:

{{{
Traceback (most recent call last):
File ""/srv/dev/mpf/nong/third-party/django/django/core/handlers/base.py"" in get_response
  74. response = callback(request, *callback_args, **callback_kwargs)
File ""/srv/dev/mpf/nong/third-party/django/django/contrib/admin/views/decorators.py"" in _checklogin
  55. return view_func(request, *args, **kwargs)
File ""/srv/dev/mpf/nong/third-party/django/django/views/decorators/cache.py"" in _wrapped_view_func
  40. response = view_func(request, *args, **kwargs)
File ""/srv/dev/mpf/nong/third-party/django/django/contrib/admin/views/main.py"" in change_list
  739. cl = ChangeList(request, model)
File ""/srv/dev/mpf/nong/third-party/django/django/contrib/admin/views/main.py"" in __init__
  570. self.get_results(request)
File ""/srv/dev/mpf/nong/third-party/django/django/contrib/admin/views/main.py"" in get_results
  628. result_list = list(self.query_set)
File ""/srv/dev/mpf/nong/third-party/django/django/db/models/query.py"" in __iter__
  103. return iter(self._get_data())
File ""/srv/dev/mpf/nong/third-party/django/django/db/models/query.py"" in _get_data
  430. self._result_cache = list(self.iterator())
File ""/srv/dev/mpf/nong/third-party/django/django/db/models/query.py"" in iterator
  172. cursor.execute(""SELECT "" + (self._distinct and ""DISTINCT "" or """") + "","".join(select) + sql, params)
File ""/srv/dev/mpf/nong/third-party/django/django/db/backends/util.py"" in execute
  12. return self.cursor.execute(sql, params)

  ProgrammingError at /admin/myapp/proxy/
  ERROR: invalid reference to FROM-clause entry for table ""myapp_asset"" HINT: Perhaps you meant to reference the table alias ""myapp_proxy__asset"". SELECT ""myapp_proxy"".""id"",""myapp_proxy"".""asset_id"",""myapp_proxy"".""port"" FROM ""myapp_proxy"" INNER JOIN ""myapp_asset"" AS ""myapp_proxy__asset"" ON ""myapp_proxy"".""asset_id"" = ""myapp_proxy__asset"".""id"" WHERE (((""myapp_proxy__asset"".""name"" ILIKE '%foo%' OR ""myapp_proxy"".""port"" ILIKE '%foo%'))) ORDER BY ""myapp_asset"".""id"" ASC
}}}

The models definitions are:

{{{
#!python
from django.db import models

class Asset(models.Model):
    name = models.CharField(maxlength=16)

    def __str__(self):
        return ""%s"" % self.name

    class Admin:
        pass

class Proxy(models.Model):
    asset = models.ForeignKey(Asset)
    port = models.PositiveIntegerField(blank=True, null=True)

    def __str__(self):
        return ""%s"" % self.asset.name

    class Admin:
        list_display = ('asset', 'port')
        search_fields = ('asset__name', 'port')

class Connection(models.Model):
    asset = models.ForeignKey(Asset, editable=False, edit_inline=models.TABULAR)
    method = models.CharField(maxlength=16, core=True)
    transport = models.CharField(maxlength=16)
    proxy = models.ForeignKey(Proxy, raw_id_admin=True, blank=True, null=True)

    class Admin:
        pass
}}}

Steps to reproduce:

1) Create an Asset called ""foo""  and save it

2) Add a new asset called ""bar"" and click on the magnifying glass next to inline edited connection.

3) Add a proxy object with asset foo and port 123. This will set the proxy id in the asset add page.

4) Click on the magnifying glass again and click on the column heading ""Asset"" column heading.

5) enter any search term in the search input. Bang!



The same happens if you swap the order of steps 4 and 5.

Strangely enough it works ok if you sort on the port column and then search.

matthew
"	defect	closed	contrib.admin	dev	normal	duplicate			Unreviewed	0	0	0	0	0	0
