点域的纬度/经度窗口小部件 [英] Latitude/longitude widget for pointfield?

查看:160
本文介绍了点域的纬度/经度窗口小部件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

PointField是否具有单独的纬度/经度输入?像DateTimeField的SplitDateTimeWidget一样。

解决方案

这是我工作的自定义字段和小部件:




b

将点输入分割为两个纬度/经度框的小部件


def __init __(self,attrs = None,date_format = None,time_format = None):
widgets =(forms.TextInput(attrs = attrs),
forms.TextInput (attrs = attrs))
super(LatLongWidget,self).__ init __(widgets,attrs)

def解压缩(self,value):
如果值:
return tuple(revers(value.coords))
return(None,None)

class LatLongField(forms.MultiValueField):

widget = LatLongWidget
srid = 4326

default_error_messages = {
'invalid_latitude':_('输入有效的纬度'),
'invalid_longitude':_('输入有效的经度'),
}

def __init __(self,* args,** kwargs):
fields =(forms.FloatField(min_value = -90,max_value =
forms.FloatField(min_value = -180,max_value = 180))
super(LatLongField,self).__ init __(fields,* args,** kwargs)

def compress(self,data_list):
如果data_list:
#如果纬度或经度为空,则提高验证错误
#(如果LatLongField为required = False,则为可能)。
如果data_list [0] in validators.EMPTY_VALUES:
raise forms.ValidationError(self.error_messages ['invalid_latitude'])
如果data_list [1]在validators.EMPTY_VALUES:
raise form.ValidationError(self.error_messages ['invalid_longitude'])
#SRID = 4326; POINT(1.12345789 1.123456789)
srid_str ='SRID =%d'%self.srid
point_str = 'POINT(%f%f)'%tuple(reversed(data_list))
return';'。join([srid_str,point_str])
return无


Is there a widget for PointField as separate latitude/longitude inputs? Like SplitDateTimeWidget for DateTimeField.

解决方案

Here's my working custom field and widget:

class LatLongWidget(forms.MultiWidget):
    """
    A Widget that splits Point input into two latitude/longitude boxes.
    """

    def __init__(self, attrs=None, date_format=None, time_format=None):
        widgets = (forms.TextInput(attrs=attrs),
                   forms.TextInput(attrs=attrs))
        super(LatLongWidget, self).__init__(widgets, attrs)

    def decompress(self, value):
        if value:
            return tuple(reversed(value.coords))
        return (None, None)

class LatLongField(forms.MultiValueField):

    widget = LatLongWidget
    srid = 4326

    default_error_messages = {
        'invalid_latitude' : _('Enter a valid latitude.'),
        'invalid_longitude' : _('Enter a valid longitude.'),
    }

    def __init__(self, *args, **kwargs):
        fields = (forms.FloatField(min_value=-90, max_value=90), 
                  forms.FloatField(min_value=-180, max_value=180))
        super(LatLongField, self).__init__(fields, *args, **kwargs)

    def compress(self, data_list):
        if data_list:
            # Raise a validation error if latitude or longitude is empty
            # (possible if LatLongField has required=False).
            if data_list[0] in validators.EMPTY_VALUES:
                raise forms.ValidationError(self.error_messages['invalid_latitude'])
            if data_list[1] in validators.EMPTY_VALUES:
                raise forms.ValidationError(self.error_messages['invalid_longitude'])
            # SRID=4326;POINT(1.12345789 1.123456789)
            srid_str = 'SRID=%d'%self.srid
            point_str = 'POINT(%f %f)'%tuple(reversed(data_list))
            return ';'.join([srid_str, point_str])
        return None

这篇关于点域的纬度/经度窗口小部件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆