Javascript GeoDjango-单张显示外键弹出窗口

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)

我正在尝试使用传单在弹出窗口上显示用户名。现在,我只能返回foreignkey id/pk作为一个数字,但我想在弹出窗口中显示用户的实际姓名。(模型中的名称字段在弹出窗口中正确显示)

这是一个简单的模型

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}