Локальная переменная Django 'form', на которую ссылаются перед присваиванием - PullRequest
0 голосов
/ 24 мая 2019

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

Работало нормально, пока я не добавил towns = City.objects.all () в коде

из django.shortcuts import рендеринг запросов на импорт из .models import City

def index (запрос): towns = City.objects.all () # вернуть все города вбаза данных

    url = 'http://api.openweathermap.org/data/2.5/weather?q={}&units=imperial&appid=ec2052730c7fdc28b89a0fbfe8560346'

    if request.method == 'POST': # only true if form is submitted
            form = CityForm(request.POST) # add actual request data to form for processing
    form.save() # will validate and save if validate

    form = CityForm()
    weather_data = []

    for city in cities:

            city_weather = requests.get(url.format(city)).json() #request the API data and convert the JSON to Python data types

            weather = {
            'city' : city,
            'temperature' : city_weather['main']['temp'],
            'description' : city_weather['weather'][0]['description'],
            'icon' : city_weather['weather'][0]['icon']
            }

            weather_data.append(weather) #add the data for the current city into our list

    context = {'weather_data' : weather_data, 'form' : form}
    return render(request, 'weathers/index.html', context)

UnboundLocalError в / локальной переменной 'form', на которую ссылается перед назначением Метод запроса: GET URL запроса: http://127.0.0.1:8000/ Версия Django: 2.2.1 Тип исключения: UnboundLocalError Значение исключения: локальная переменная 'форма', на которую ссылается перед назначением Местоположение исключения: C: \ Users \ Admin \ Desktop \ the_weather \ weathers \ views.py в индексе, строка 12 Исполняемый файл Python: C: \ Users \ Admin \ AppData \ Local \ Programs \ Python\ Python37-32 \ python.exe Версия Python: 3.7.3 Путь к Python: ['C: \ Users \ Admin \ Desktop \ the_weather', 'C: \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python37-32\ python37.zip ',' C: \ Users \ Admin\ AppData \ Local \ Programs \ Python \ Python37-32 \ DLLs, 'C: \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python37-32 \ lib', 'C: \ Users \ Admin \ AppData \ Local\ Programs \ Python \ Python37-32 ',' C: \ Users \ Admin \ AppData \ Roaming \ Python \ Python37 \ site-packages ',' C: \ Users \ Admin \ AppData \ Local \ Programs \ Python \ Python37-32\ lib \ site-packages '] Время сервера: пт, 24 мая 2019 года 04:09:08 + 0000

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Вы делаете ошибку здесь

if request.method == 'POST': # only true if form is submitted
            form = CityForm(request.POST) # add actual request data to form for processing
    form.save() # will validate and save if validate

    form = CityForm()

Если запрос GET, он непосредственно переходит к form.save() до его назначения.

Чтобы решить эту проблему

if request.method == 'POST':
    form = CityForm(request.POST)
    form.save()

form = CityForm()
0 голосов
/ 24 мая 2019

Вам нужно изменить:

    if request.method == 'POST': # only true if form is submitted
            form = CityForm(request.POST) # add actual request data to form for processing
    form.save() # will validate and save if validate
    form = CityForm()

на

       if request.method == 'POST': # only true if form is submitted
            form = CityForm(request.POST) # add actual request data to form for processing
            if form.is_valid():
                 form.save() # will validate and save if validate
                 # having form in same scope when there is a post request
       else:
           form = CityForm()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...