【问题标题】:Django: Populating data into a model based on an identifierDjango:根据标识符将数据填充到模型中
【发布时间】:2011-06-14 03:55:16
【问题描述】:

在我的 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 获取 latitudelongitudearea 等内容。

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

这样的事情可能吗?

【问题讨论】:

    标签: python django django-models model freebase


    【解决方案1】:

    我在我的 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 字段是唯一对用户可见的字段。

    【讨论】:

    • 谢谢,这听起来是个不错的解决方案。我想如果您想显示 lat 和 lng 字段以供稍后编辑,那么您可以将条件语句放入 Meta 类中“fields =”?
    • 是的,完全正确。此外,您可以将模型单独传递给模板,并将任何字段数据显示为“只读”。例如,在可编辑的zip 字段旁边,我显示city_state 字符串(计算一次),这样每次更新zip 时,用户都可以验证他们的城市/州。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 2014-06-11
      • 2020-07-23
      • 2013-12-06
      • 2021-12-01
      • 2021-11-19
      相关资源
      最近更新 更多