Django: заполнение данных в модели на основе идентификатора - PullRequest
1 голос
/ 23 января 2011

В моем проекте 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 (например, / en / manchester_united_kingdom ), чтобы мы могли затем использовать API для извлечения таких вещей, как latitude, longitude и area.

Короче говоря, я хочу позволить пользователям предоставить некоторый идентификатор, который затем можно будет использовать для получения других данных внутри модели. В идеальном мире производные поля должны быть изначально скрыты в системе администратора, но затем должны быть видны после заполнения, чтобы их можно было редактировать.

Возможна ли такая вещь?

Ответы [ 2 ]

2 голосов
/ 24 января 2011

Я делаю нечто подобное в моей 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 производной формы является единственным, видимым для пользователя.

0 голосов
/ 24 января 2011

Если вы переопределяете метод save () вашего объекта, вы можете установить в нем значение lat-long. Не уверен теперь, чтобы скрыть поля таким образом, хотя. В последней версии Django есть новые вещи для полей, доступных только для чтения, и если вы можете сделать это волшебным образом с помощью специального администратора, вы можете получить ...

...