2016-02-29 2 views
-1

Добрый день, я не могу понять, что я делаю неправильно здесь. Я использовал это представление базовой функции для хранения данных об утилизации в базе данных с помощью модели django, но теперь она больше не сохраняется. Я не могу понять, почему. Есть идеи?Как сохранить данные в модели db django?

def weather_fetch(request): 
    context = None 
    corrected_rainChance = None 
    url = 'http://weather.news24.com/sa/cape-town' 
    extracted_city = url.split('/')[-1] 
    city = extracted_city.replace('-', " ") 
    print(city) 
    url_request = urlopen(url) 
    soup = BeautifulSoup(url_request.read(), 'html.parser') 
    city_list = soup.find(id="ctl00_WeatherContentHolder_ddlCity") 
    city_as_on_website = city_list.find(text=re.compile(city, re.I)).parent 
    cityId = city_as_on_website['value'] 
    json_url = "http://weather.news24.com/ajaxpro/TwentyFour.Weather.Web.Ajax,App_Code.ashx" 

    headers = { 
     'Content-Type': 'text/plain; charset=UTF-8', 
     'Host': 'weather.news24.com', 
     'Origin': 'http://weather.news24.com', 
     'Referer': url, 
     'User-Agent': 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/48.0.2564.82 Chrome/48.0.2564.82 Safari/537.36', 
     'X-AjaxPro-Method': 'GetCurrentOne'} 

    payload = { 
     "cityId": cityId 
    } 
    request_post = requests.post(json_url, headers=headers, data=json.dumps(payload)) 
    data = re.sub(r"new Date\(Date\.UTC\((\d+),(\d+),(\d+),(\d+),(\d+),(\d+),(\d+)\)\)", convert_date, request_post.text) 
    data = data.strip(";/*") 
    data = json.loads(data) 
    forecast = data['Forecast'] 
    if forecast["Rainfall"] == '*': 
     rainChance = 0 
     corrected_rainChance = rainChance 
    else: 
     try: 
      obj = WeatherData.objects.get_or_create(
       min_temp=forecast["LowTemp"], high_temp=forecast["HighTemp"], 
       date=forecast["Date"], wind_speed=forecast["WindSpeed"], rain=corrected_rainChance 
      ) 
     except WeatherData.DoesNotExist: 
      obj = WeatherData.objects.get_or_create(
       min_temp=forecast["LowTemp"], high_temp=forecast["HighTemp"], 
       date=forecast["Date"], wind_speed=forecast["WindSpeed"], 
       rain=corrected_rainChance 
      ) 
      obj.save() 
      context = {'context': obj} 
      print(context) 
    return render(request, 'forecastApp/pages/fetch_weather.html', context) 

class WeatherData(models.Model): 
    date = models.DateTimeField(default=timezone.now) 
    wind_speed = models.DecimalField(max_digits=3, decimal_places=1) 
    high_temp = models.DecimalField(max_digits=3, decimal_places=1) 
    min_temp = models.DecimalField(max_digits=3, decimal_places=1) 
    rain = models.IntegerField(default=0) 

    def __str__(self): 
     return ' '.join(str([self.date.month, self.date.day, self.date.year])) 
+0

Что именно вы изменили? Что вы подразумеваете под словом «это не спасение» - вы получаете сообщение об ошибке или просто не можете найти объект в db? – ben432rew

+0

Также вы можете опубликовать определение класса 'WeatherData'? – ben432rew

+0

@ ben432rew все, что я могу сказать, я ничего не вижу в своем db, и когда я печатаю контекст, это не –

ответ

0

Существует определенная проблема с вашим блоком try/except. Забавчивая ваш код работает до создания объекта, вы должны изменить его на:

if forecast["Rainfall"] == '*': 
    rainChance = 0 
    corrected_rainChance = rainChance 
else: 
    obj = WeatherData.objects.get_or_create(
      min_temp=forecast["LowTemp"], high_temp=forecast["HighTemp"], 
      date=forecast["Date"], wind_speed=forecast["WindSpeed"], rain=corrected_rainChance 
     ) 
    # obj.save() --> you don't need to save the obj again. 
    context = {'context': obj} 
    print(context) 
+0

В этом проблема это не сработало. он не сохраняет –

+0

Что такое вывод 'context' в этом случае? – ilse2005

+0

ничего даже не печатает. но у меня есть это сохранить сейчас, делая это rainChance = 0 corrected_rainChance = rainChance OBJ = WeatherData.objects.get_or_create ( min_temp = прогноз [ "LowTemp"], high_temp = прогноз [ "HighTemp"], дата = прогноз [» Date "], wind_speed = прогноз [" WindSpeed ​​"], rain = corrected_rainChance ) context = {'context': obj} return render (request,'Avpp/pages/fetch_weather.html ', context) –

0

Я бы сказал, что сначала вы должны очистить свой код. На самом деле это не выглядит модульным. Вы должны разделить вид конечной точки на модульные функции, чтобы стало намного легче читать. Вы смешиваете стиль camelCase и under_score в своем именовании переменных, который считается плохим.

После того, как вы это сделали, вы готовы перейти к актуальной проблеме :). Для этого я хочу, чтобы вы познакомились с The python debugger. С этим вы можете легко отлаживать код python. Oldschool путь будет вставлять отпечатки в ваш код, но это, как правило, медленно, если вы не чувствуете, где проблема может быть.

+0

Я не знаю, действительно ли это действительно так, но я использую django-debug-toolbar для отладки –

Смежные вопросы