Javascript GeoDjango-单张显示外键弹出窗口
我正在尝试使用传单在弹出窗口上显示用户名。现在,我只能返回foreignkey id/pk作为一个数字,但我想在弹出窗口中显示用户的实际姓名。(模型中的名称字段在弹出窗口中正确显示) 这是一个简单的模型Javascript GeoDjango-单张显示外键弹出窗口,javascript,django,leaflet,geojson,geodjango,Javascript,Django,Leaflet,Geojson,Geodjango,我正在尝试使用传单在弹出窗口上显示用户名。现在,我只能返回foreignkey id/pk作为一个数字,但我想在弹出窗口中显示用户的实际姓名。(模型中的名称字段在弹出窗口中正确显示) 这是一个简单的模型 class Reserve(gis_models.Model): geom = gis_models.PolygonField() objects = gis_models.GeoManager() user = models.ForeignKey(User)
class Reserve(gis_models.Model):
geom = gis_models.PolygonField()
objects = gis_models.GeoManager()
user = models.ForeignKey(User)
name = models.CharField(max_length = 240)
观点
html
功能我们的_层(地图、选项){
var all_reserve_datasets=new L.GeoJSON.AJAX(“{%url'reserve_datasets”%}”{
onEachFeature:功能(功能,图层){
layer.bindPopup('Name:'+feature.properties.Name+'User:'+feature.properties.User);
},
});
所有应用的储量。添加至(地图);
}
{%lapper\u map“gis”callback=“window.our\u layers”%}
内置geojson序列化程序只能序列化模型字段。尝试以下方法序列化模型中的其他属性:
class BetterGeoJsonSerializer(Serializer):
def _init_options(self):
self.extra_attrs = self.options.pop('extra_attrs', ())
super()._init_options()
def get_dump_object(self, obj):
d = super().get_dump_object(obj)
for attr in self.extra_attrs:
v = obj
for s in attr.split("."):
v = getattr(v, s)
d[attr] = v
return d
def to_geojson(queryset, extra_attrs=(), **options):
s = BetterGeoJsonSerializer()
s.serialize(queryset, extra_attrs=extra_attrs, **options)
return s.getvalue()
# ...
def reserve_datasets(request):
extra = ('user.username',)
reserve= to_geojson(Reserve.objects.all(), extra)
return HttpResponse(reserve, content_type='application/json')
您还可以使用此命令序列化属性:
class Reserve(models.Model):
geom = models.PolygonField()
user = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=240)
@property
def xxx(self):
return 12345
@property
def user_info(self):
return {'id': self.user.id, 'name': self.user.username, 'email': self.user.email}
在视图中使用extra=('user\u info','xxx')
对于复杂序列化,请考虑使用。
class BetterGeoJsonSerializer(Serializer):
def _init_options(self):
self.extra_attrs = self.options.pop('extra_attrs', ())
super()._init_options()
def get_dump_object(self, obj):
d = super().get_dump_object(obj)
for attr in self.extra_attrs:
v = obj
for s in attr.split("."):
v = getattr(v, s)
d[attr] = v
return d
def to_geojson(queryset, extra_attrs=(), **options):
s = BetterGeoJsonSerializer()
s.serialize(queryset, extra_attrs=extra_attrs, **options)
return s.getvalue()
# ...
def reserve_datasets(request):
extra = ('user.username',)
reserve= to_geojson(Reserve.objects.all(), extra)
return HttpResponse(reserve, content_type='application/json')
class Reserve(models.Model):
geom = models.PolygonField()
user = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=240)
@property
def xxx(self):
return 12345
@property
def user_info(self):
return {'id': self.user.id, 'name': self.user.username, 'email': self.user.email}