1

在我的 Django 项目中,假设我有以下模型:

class City(models.Model):
    name = models.CharField(max_length=255)
    freebase_id = models.CharField(max_length=255)
    latitude = models.DecimalField()
    longitude = models.DecimalField()
    area = models.IntegerField()

(为简单起见,我省略了 DecimalField 所需的参数)。

用户可以手动输入所有字段,但我想通过让用户在管理区域输入某种 ID 来让生活更轻松,比如 Freebase ID(例如/en/manchester_united_kingdom),这样我们就可以使用API 来获取latitude,longitudearea.

长话短说,我想让用户提供一些 ID,然后可以使用这些 ID 在模型中派生其他数据。在理想情况下,派生字段最初应该隐藏在管理系统中,但一旦填充后就可以看到,以便可以对其进行编辑。

这样的事情可能吗?

4

2 回答 2

2

UserProfile我在我的模型中做类似的事情。我有一个邮政编码字段,如果它由用户填写,则用于进行地理查找以获取城市/州和纬度/经度并将它们存储在模型中各自的字段中:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    ...
    zip = models.CharField(max_length=12, blank=True, null=True)
    city_state = models.CharField(max_length=30, blank=True, null=True)
    lat = models.DecimalField(max_digits=12, decimal_places=9, blank=True, null=True)
    lng = models.DecimalField(max_digits=12, decimal_places=9, blank=True, null=True)

    def save(self, *args, **kwargs):
        if self.zip:
            (city_state, lat, lng) = get_lat_lng(self.zip)
            if city_state and lat and lng:
                self.city_state = city_state
                self.lat = lat
                self.lng = lng

        super(UserProfile, self).save(*args, **kwargs)

class UserProfileForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ('zip',)

请注意,派生表单的zip字段是唯一对用户可见的字段。

于 2011-01-23T21:58:00.307 回答
0

如果您覆盖对象的 save() 方法,您可以在其中设置您的 lat-long。不过现在不确定是否要以这种方式隐藏字段。最新的 Django 中有用于只读字段的新内容,如果您可以通过自定义管理员管理器神奇地做到这一点,您可能有办法...

于 2011-01-23T21:33:11.273 回答