2012-02-03 21 views
2

Addressモデルには、2つのフロートフィールド、latlngが含まれています。私はnearby(lat, lng, distance)メソッドを持つカスタムモデルマネージャを作成しました。生のSQLを使用して、特定の半径内にあるAddressだけを返します。 (GeoDjangoは過度のように見えた)。Django adminフィルタリストとカスタムモデルマネージャの追加メソッド

例コール: Address.objects.nearby(53.3, 13.4, 10)(クエリセットを返す)

今、私は動的に理想的なユーザーがGoogleマップ上の場所を選択させると最大距離は、使用して(この方法を使ってDjangoのadminにAddressオブジェクトをフィルタしたいですスライダー)。私はそれをどのように達成するか考えていない。誰かが私を正しい方向に向けることができますか?あなたは私のために任意のJavaScriptを記述する必要はありません

明確化 は、私はDjangoの管理者は、私が/admin/appname/address/?lat=53&long=13&dist=10ようなクエリを行うことができるように、URLに余分なクエリパラメータを評価するようにする方法を知りたいです。私はおそらく、Googleマップと必要なJavaScriptマジックをテンプレートに埋め込む方法を考え出すことができます。

UPDATE 私はそうのようなModelAdminの中01​​を上書きしようとしました:

def queryset(self, request): 
    try: 
     lat = float(request.REQUEST['lat']) 
     lng = float(request.REQUEST['lng']) 
     dist = int(request.REQUEST['dist']) 
     matches = Address.objects.nearby(lat=lat, lng=lng, dist=dist) 
     return matches 
    except: 
     return super(ReportAdmin, self).queryset(request) 

ただし、管理者はそれを好きではないとの結果をフィルタリングすることなく、?e=1で返します。

答えて

0

私はFKとしてaddressを持つオブジェクトクラスのModelAdminのにこれを追加しました?address_dst=lat,lng,dstのように。

いい方法はありますか?

-1

管理者リスト表示ページでこの機能が必要な場合は、カスタムフィルタを作成できます。

解決策を参照してください:Custom Filter in Django Admin on Django 1.3 or below。私は私がフィルタリングできるようにするモデル

def _filter_or_exclude(self, negate, *args, **kwargs): 
    try: 
     value = kwargs.pop('address__dst') 
     matches = self.nearby(*map(float, value.split(','))) 
     pks = [m.pk for m in matches] 
     kwargs.update({ 'pk__in': pks }) 
    except: 
     pass 
    return super(ReportQuerySet, self)._filter_or_exclude(
      negate, *args, **kwargs) 

にこれを追加しました

def lookup_allowed(self, lookup, *args, **kwargs): 
     if lookup == 'address__dst': 
      return True 
     return super(ReportAdmin, self).lookup_allowed(lookup, args, **kwargs) 

+0

私の知る限り、これは既存の 'lookup fields'をフィルタリングすることしかできません。この例では、 'fieldname_gte'と' fieldname_lte'を使用しています。 db manager extraメソッドでは、latlong + distanceの新しいルックアップフィールドが得られません。 – nisc

関連する問題