我的Address
模型包含两个浮点字段lat
和lng
。我编写了一个带有nearby(lat, lng, distance)
方法的自定义模型管理器,该方法使用原始SQL仅返回位于特定半径内的Address
个es。 (GeoDjango似乎有点矫枉过正)。
示例电话:
Address.objects.nearby(53.3, 13.4, 10)
(返回QuerySet)
现在我想使用此方法动态过滤Django管理员中的Address
个对象(理想情况下,让用户在Google地图上选择一个位置,使用滑块选择最大距离)。我不知道如何实现这一目标。有人能指出我正确的方向吗?
澄清
您不需要为我编写任何JavaScript,我只想知道如何让Django管理员在URL中评估额外的查询参数,以便我可以执行/admin/appname/address/?lat=53&long=13&dist=10
之类的查询。然后,我可以自己弄清楚如何将Google地图和所需的JavaScript魔法填入模板中。
更新
我试图像这样覆盖ModelAdmin中的queryset
:
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 :(得分: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 :(得分:-1)
如果您需要在管理列表显示页面上显示此功能,则可以编写自定义过滤器。
请参阅:Custom Filter in Django Admin on Django 1.3 or below中的解决方案。