2011-01-23 10 views
1

에 따라 모델에 데이터를 채우기, 이제 나는 다음과 같은 모델을 가정 해 봅시다 : 장고 : 내 장고 프로젝트에서 식별자

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를 입력하면 더 쉽게 사용할 수 있습니다. latitude, longitudearea과 같은 항목을 가져 오는 API

요약하면 사용자가 모델 내부의 다른 데이터를 유도하는 데 사용할 수있는 ID를 제공 할 수있게하려는 것입니다. 이상적인 세계에서 파생 된 필드는 처음에는 관리 시스템에 숨겨져 있어야하지만 일단 편집되면 표시되도록 만들어야합니다.

그런 것이 가능합니까?

답변

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',) 
: 나는 그것이 사용자에 의해 채워집니다 경우, 도시/국가와 위도/LNG를 얻을 모델에서 각 분야에 저장할 지리적 조회를 수행하는 데 사용되는 우편 번호 필드가

파생 된 양식의 zip 필드는 사용자가 볼 수있는 유일한 필드입니다.

+0

감사합니다. 좋은 해결책 인 것 같습니다. 나중에 편집을 위해 lat 및 lng 필드를 표시하려면 "fields ="주위의 Meta 클래스에 조건문을 넣을 수 있습니까? –

+0

예. 또한 모델을 템플릿에 별도로 전달하고 모든 필드 데이터를 "읽기 전용"으로 표시 할 수 있습니다. 예를 들어, 편집 가능한'zip' 필드 옆에'city_state' 문자열 (한 번 계산 됨)이 표시되므로 우편 번호가 업데이트 될 때마다 사용자는 도시/주를 확인할 수 있습니다. – gorus

0

개체의 save() 메서드를 재정의하는 경우 해당 개체의 lat-long을 설정할 수 있습니다. 그런 식으로 필드를 숨길 지 잘 모르겠다. 읽기 전용 필드에 대한 최신 Django의 새로운 기능이 있습니다. 사용자 정의 관리자를 통해 마술처럼 그렇게 할 수 있다면 ...