データベース内の座標が間違っている場合は、それを修正する必要があります。で./manage.py shell
:
from app.models import Point
for obj in Point.objects.all():
obj.lat, obj.lng = obj.lng, obj.lat
obj.save()
これで、「一種の逆」の問題を修正するだけで済みます。そもそも座標が間違った方法で保存されている理由。
編集
逆に座標のみを返したい場合は、モデルにカスタム メソッドを定義して、カスタムの「行レベル」機能をオブジェクトに追加できます。参照:モデル メソッド。
def _get_reversed_point(self):
"Returns the reversed point (lng, lat)."
return (self.point.lng, self.point.lat)
reversed_point = property(get_reversed_point)
これで、通常どおりデータベースにクエリを実行できます。逆のポイントを処理する場合obj.reversed_point
は、逆のタプルを返します。
編集2
はフォームのreversed_point
一部ではないため、自分で追加しない限り変更ビューで使用できません。これはModelAdmin.formによって行われます。フォームでは、フィールドを (再) 定義し、ウィジェットを指定できます。切除ウィジェットをオーバーライドしてウィジェットを作成します。こんなふうになります:
from somewhere import SomeWidget
class MyWidget(SomeWidget):
def render(self, name, value, attrs=None):
output = []
template = '<p>Your html that will display a beautiful map. Point: %(lat)s %(lng)s</p>'
output.append(template % {'lat':self.instance.point.lat, 'lng':self.instance.point.lng, })
output.append(super(SomeWidget, self).render(name, value, attrs))
return mark_safe(u''.join(output))
class MyForm(forms.ModelForm):
point = forms.SomeField(widget=MyWidget)
def __init__(self, *args, **kwargs):
super(MyForm, self).__init__(*args, **kwargs)
if hasattr(self, 'instance'):
# This gives the widget access to all fields in MyModel object.
self.fields['point'].widget.instance = self.instance
class Meta:
model = MyModel
exclude = []
class MyAdmin(admin.ModelAdmin):
form = MyForm
GeoDjango にはいくつかのウィジェットが付属しています。彼らのコードを読むことは良い出発点であり、ウィジェットがどこでポイント情報を「間違った」方法で適用するかがわかります。幸運を。