2012-02-03 85 views
2

我有一個Address模型,其中包含兩個浮動字段,latlng。我已經使用nearby(lat, lng, distance)方法編寫了一個自定義模型管理器,該方法使用原始SQL僅返回位於特定半徑範圍內的Address es。 (GeoDjango似乎是矯枉過正)。Django管理過濾器列表與自定義模型管理器額外的方法

調用示例: Address.objects.nearby(53.3, 13.4, 10)(返回查詢集)

現在我想用這個方法(理想情況下讓用戶選擇一個谷歌地圖上的位置,並使用一個最大距離動態篩選在Django管理Address對象滑塊)。我不知道如何實現這一點。任何人都可以將我指向正確的方向嗎?

澄清 你不需要寫任何JavaScript對我來說,我只是想知道如何讓Django管理的URL評估額外的查詢參數,這樣我可以做的查詢,如/admin/appname/address/?lat=53&long=13&dist=10。那麼我可能會弄清楚如何將Google地圖和所需的JavaScript魔法填充到模板中。

UPDATE 我試圖覆蓋queryset中的ModelAdmin像這樣:

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

我已經添加此對象類的ModelAdmin具有address作爲FK:

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

我已將此添加到模型

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) 

讓我來過濾像?address_dst=lat,lng,dst

有沒有更好的解決方案?

-1

如果您需要管理員列表顯示頁面上的此功能,您可以編寫自定義過濾器。

請參閱解決方案:Custom Filter in Django Admin on Django 1.3 or below

+0

據我所知,這隻允許你對現有的「查找字段」進行過濾。在這個例子中,他們使用'fieldname_gte'和'fieldname_lte'。 db manager extra方法不會爲latlong + distance提供新的查找字段。 – nisc 2012-02-03 10:35:16