0

PostGISで位置データを保存するアプリケーションをDjango1.5で構築しています。プロトタイプの場合、新しい位置レコードを作成するフォームでは、ユーザーが緯度と経度の座標を入力する必要があります(これがコーディングするのに最も簡単な設定だと思います)。

私はそのModelFormようなものを作成しました:

class LocationForm(forms.ModelForm):
  # Custom fields to accept lat/long coords from user.
  latitude  = forms.FloatField(min_value=-90, max_value=90)
  longitude = forms.FloatField(min_value=-180, max_value=180)

  class Meta:
    model   = Location
    fields  = ("name", "latitude", "longitude", "comments",)

ここまでは順調ですね。ただし、Locationモデルにはフィールドlatitudeもありません。longitude代わりに、を使用しPointFieldて場所の座標を保存します。

from django.contrib.gis.db import models

class Location(models.Model):
  name = models.CharField(max_length=200)
  comments = models.TextField(null=True)

  # Store location coordinates
  coords = models.PointField(srid=4326)

  objects = models.GeoManager()

私が探しているのは、latitudelongitude入力の値を取得するコードを挿入し、ユーザーが有効な値を使用してフォームを送信したら、それらをPointオブジェクトとしてLocation'sフィールドに格納する場所です。coords

たとえば、Symfony1.4のsfFormDoctrine::doUpdateObject()メソッドに相当するDjangoを探しています。

4

3 に答える 3

2

stummjrの回答からのガイダンスと、のぞき見でdjango.forms.BaseModelForm、私は解決策を見つけたと信じています。

class LocationForm(forms.ModelForm):
  ...

  def save(self, commit=True):
    self.instance.coords = Point(self.cleaned_data["longitude"], self.cleaned_data["latitude"])
    return super(LocationForm, self).save(commit)
于 2013-01-11T17:36:09.250 に答える
0

モデルのsave()メソッドをオーバーライドできます。Location

class Location(models.Model):
    name = models.CharField(max_length=200)
    comments = models.TextField(null=True)

    # Store location coordinates
    coords = models.PointField(srid=4326)

    objects = models.GeoManager()

    def save(self, *args, **kwargs):
        self.coords =  ... # extract the coords here passed in through kwargs['latitude'] and kwargs['longitude']
        # don't forget to call the save method from superclass (models.Model)
        super(Location, self).save(*args, **kwargs)

フォームを処理するためのこのビューがあるとします。

  def some_view(request):
      lat = request.POST.get('latitude')
      longit = request.POST.get('longitude')
      ...
      model.save(latitude=lat, longitude=longit)

もう1つのオプションは、ModelFormのsaveメソッドをオーバーライドすることです。

于 2013-01-11T17:28:32.793 に答える
0

フォームのクリーンメソッドをオーバーライドして座標を設定します

    def clean(self):
        lat = self.data.get("Longitude")
        long = self.data.get("Latitude")
        p = Point(long,lat,srid=4326)
        self.cleaned_data["coords"] = p
        super(LocationForm, self).clean()
于 2017-02-12T09:04:51.617 に答える