Динамическое заполнение свойств модели из вызова javascript - PullRequest
0 голосов
/ 21 марта 2011

Описание проблемы:

1] У меня есть модель со свойствами страны и города

class UserReportedData(db.Model):
  #country selected by the user, this will also populate the drop down list on the html page
  country = db.StringProperty(default='Afghanistan',choices=['Afghanistan','Aring land    
  Islands','Albania'])
  #city selected by the user
  city = db.StringProperty()

Связанная форма

class UserReportedDataForm(djangoforms.ModelForm):

    class Meta:
       model = UserReportedData

2] С помощью stackoverflow (спасибо Крису, опубликовавшему: GeoIP с google app engine и python ), я выяснил, как использовать javascript на html-странице, чтобы узнать страну и город для Пользователь. Следующий код успешно может распечатать значения страны и города на странице

<!-- including the  geoip javascript library -->
<script  
  src="http://j.maxmind.com/app/geoip.js"
  type="text/javascript">
</script>

<script type="text/javascript">
   if (window.geoip_country_name) {
    document.write(geoip_country_name())
    document.write(geoip_city())
   }
</script>

3] Теперь, когда отображается страница, текстовое поле страны и города и значения по умолчанию поступают из формы django (извините, я не могу опубликовать изображение из-за ограничений)

Вопрос:

Я хочу, чтобы данные о стране и городе пользователя были заполнены в текстовом поле страны и города. Итак, каким-то образом форма или модель python должна вызывать код javascript и получать данные о стране и городе для пользователя.

Спасибо

[EDIT # 1] Редактировать на основе подхода, предложенного @ Haochi

Ниже приведены идентификаторы, сгенерированные djangoforms

<select name="country" id="id_country">
<input type="text" name="city" id="id_city" />

Попробовал следующий javascript на html-странице

  <script type="text/javascript">
  if (window.geoip_country_name) {
     document.getElementById("id_country").value = geoip_country_name();
     document.getElementById("id_city").value = geoip_city();
     document.write("this is a javasctipt print"); /* this prints properly*/
     document.write(document.getElementById("id_country").value);
     document.write(document.getElementById("id_city").value);
    }
  </script>

Это, однако, не заполнило значения для текстовых полей id_country и id_city соответственно.

[EDIT # 3] Так выглядит HTML-файл. Теперь я переместил расчет GEOIP со стороны сервера на сторону клиента

<!-- Text box for city, later on in the design this will be a drop down box -->
<p> Select City: </p>
<div>
  <input type="text" name="city" id="city"> 
  <!-- By default, we will select users city -->
  <script type="text/javascript" language="JavaScript">
     document.getElementById("city").value = geoip_city()
  </script>     
</div>  

<p> Select Country: </p>
<select name="selCountry" id="country">
<!-- By default, we will select users country -->
<script type="text/javascript" language="JavaScript">
    document.write("<option value=\"" + geoip_country_name() + "\" selected>"
</script>
<option value="United States">
    United States
 </option>
 <option value="United Kingdom">
    United Kingdom
 </option>

Полагаю, что лучше всего перенести весь javascript в отдельный файл, мне нужно попробовать это и соответствующим образом изменить HTML-код.

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Я написал следующий класс Python, чтобы найти страну и город для пользователя.Это работает, если кто-то обнаружит какие-либо проблемы или что-то, что может быть изменено для эффективности, пожалуйста, дайте мне знать

from google.appengine.api import urlfetch

#class that is used for geo ip functionality of the application
class GeoIpLocator:

#method that will return the country city dictionary based on users GeoIP location
#dictionary format {"country_name": "USA", "city":"chicago"}
def get_country_city_dictionary(self):
    url = "http://j.maxmind.com/app/geoip.js"
    result = urlfetch.fetch(url)
    if result.status_code == 200:
        keep = ['country_name', 'city']
        results = dict([x for x in re.findall("geoip_(.*?)\(.*?\'(.*?)\'", result.content) if x[0] in keep])
        results.update({'source': 'mmind'})
        if results:
            return results
        else:
            return {}       

[EDIT # 1] Это не будет работать и вернет IP-адрес сервера, на которомприложение python загружается, спасибо @Calvin за указание на это.

0 голосов
/ 21 марта 2011

Предполагается, что вашими идентификаторами для этих двух входов являются страна и город:

document.getElementById("country").value = geoip_country_name()
document.getElementById("city").value = geoip_city()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...