Django forms: невозможно получить доступ к локальной переменной 'form', если она не связана со значением

Условие: У меня есть модель, создана пустая таблица в базе данных, и я пытаюсь создать html форму, которая будет заполнять поля соответствующих колонок таблицы. И вот как выглядит мое приложение:

models.py

from django.db import models

class Cities(models.Model):
    city = models.CharField(max_length=100)

    def __str__(self):
    return self.state   

class Routes(models.Model):
    route_name = models.CharField(max_length=50, default='Route')
    lvl = models.IntegerField(default=0)
    about = models.TextField(max_length=1500)
    total_distance = models.IntegerField(default=0)
    city = models.ForeignKey(Cities, on_delete=models.CASCADE)

forms.py

from django.forms import ModelForm
from .models import Routes

class RouteForm(ModelForm):
    class Meta:
        model = Routes
        fields = '__all__'

views.py

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponse

from routes_form.forms import RouteForm


def getAbout(request):
    if request.method == 'POST':
        form = RouteForm(request.POST)
        if form.is_valid():
            form.save()
    return render(request, 'routes_form/form_page.html', {'form': form})

form.html

<form method="post">
        {% csrf_token %}
        <legend>
            <h2>About</h2>
        </legend>
        {{ form }}
        <input type="text" placeholder="Write more about the route: about waypoints, points of interest and warnings.">
        <input type="submit" value="Send route">
</form>

Я уже пытался сделать все, как указано в документации Django Forms. Но все равно что-то не так. Даже в момент запуска сервера пишет ошибку:

cannot access local variable 'form' where it is not associated with a value

Потому что вы не определили form для метода GET так:

def getAbout(request):
    if request.method == 'POST':
        form = RouteForm(request.POST)
        if form.is_valid():
            form.save()
    else:
        form=RouteForm()
    return render(request, 'routes_form/form_page.html', {'form': form})

Примечание: Модели в Django пишутся в единственном числе, так как Django сам добавляет s в качестве суффикса, поэтому лучше называть модели как City и Route.

Здесь вы передали form = RouteForm(request.POST) объект для POST запроса, который нужно передать для GET запроса, так что, когда функция def getAbout(request) вызывается с GET запросом, то отображает его следующим образом...

def getAbout(request):
  form=RouteForm() # <---- called at GET request
  if request.method == 'POST':
    form = RouteForm(request.POST) # <---- called at GET request
    if form.is_valid():
      form.save()
      return redirect("/")
  return render(request, 'routes_form/form_page.html', {'form': form})
Вернуться на верх