在我的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
,longitude
和area
等内容。
长话短说,我想让用户提供一些ID,然后可以用它来获取模型中的其他数据。在理想的世界中,派生字段应该最初隐藏在管理系统中,但一旦填充就可以显示,以便可以对它们进行编辑。
这样的事情可能吗?
答案 0 :(得分:2)
我在UserProfile
模型中做了类似的事情。我有一个邮政编码字段,如果它被用户填写,则用于进行地理查找以获取城市/州和lat / lng并将它们存储在模型中各自的字段中:
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
字段是用户可见的唯一字段。
答案 1 :(得分:0)
如果覆盖对象的save()方法,则可以设置lat-long。现在不确定以这种方式隐藏字段。最新的Django中有新的东西用于只读字段,如果你可以通过自定义管理员管理器神奇地做到这一点,你可能会有... ...