我的一个模型具有纬度和经度字段,它们作为浮点数存储在数据库中 . 我喜欢这样保留它,因为它允许我最有效地使用它们 .
我希望用户能够以这种格式在股票管理界面中编辑它们:( / - )DD MM SS.S(这就是大多数GPS设备向最终用户呈现坐标的方式) .
我想到了实现这个的三种方法:
-
使用GeoDjango - 开销太大,我根本不需要只有两个字段的完整框架 .
-
定义自定义 model 字段,somehow in this way . 看起来像很多编码,我不能完全确定我是否能够使用Django数据库接口轻松访问浮点表示 .
-
使用MultiValueField和MultiWidget - 这不是一个完全糟糕的解决方案,但是文档记录很差,还包括一些编码和不必要的小部件,分钟和秒 .
但理想情况下,我想这样做:
- 使用自定义 form 字段,该字段将使用标准TextInput表单窗口小部件和标准FloatField模型字段 .
我确信to_python()方法可以处理文本输入并将其转换为float . 但是在编辑模型时如何告诉Django将float转换为我的lat / lng表示?我该怎么把它们粘在一起?
2 回答
为什么不在模型中添加更多字段来保存坐标数据,然后让模型的
save()
方法将这些字段转换为纬度和经度数字?然后在admin中,使lat / lon只读,以便可以查看值,但不能编辑 . 或者,您可能决定不显示它们!例如:
我假设你还需要
lon_degrees
字段,我没有坐标的专家 . 我已经离开了那些例子 . 您可能还想为管理员创建一个新窗口小部件以使其显示良好,或者只是覆盖change_form.html
以使三个字段显示在同一行上,但这略微超出了此答案的范围 .我最近有这个要求并且有点被带走,但我想我会分享 . (Django 2.0 . )
我创建了一个30个字符的CharField来包含输入的坐标,例如:
N 35º 44.265 W 41º 085.155
(顺便说一下,我不知道它在哪里......)并安排模型存储字段值 .输入CharField指定
validators=[validate_coords]
请注意,度数符号可以指定多种方式或完全省略 .该模型包括以下简短方法:
在
admin.py
中,我从视图中排除latitude
和longitude
字段(两者都是浮点字段),以避免混淆用户 . 数字字段会自动计算,但不会显示 .