0

我正在 Django 1.5 上构建一个使用 PostGIS 存储位置数据的应用程序。对于原型,创建新位置记录的表单要求用户输入纬度和经度坐标(我认为这是最容易编写代码的设置)。

我创建了一个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字段。相反,它使用 aPointField来存储位置的坐标:

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

例如,我正在寻找与 Symfony 1.4 的sfFormDoctrine::doUpdateObject()方法等效的 Django。

4

3 回答 3

2

在stummjr's answer 的一些指导下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)

另一种选择是覆盖 ModelForm 中的保存方法

于 2013-01-11T17:28:32.793 回答
0

覆盖 Form clean 方法来设置坐标

    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 回答