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 の必須パラメーターは省略しました)。

ユーザーはすべてのフィールドを手動で入力できますが、ユーザーが Freebase ID ( /en/manchester_united_kingdomなど) のような何らかの ID を管理エリアに入力できるようにすることで、作業を楽にしたいと考えています。latitudelongitudeおよびのようなものを取得するための API area

簡単に言うと、モデル内の他のデータを取得するために使用できる 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 に答える