Django 表单:无法访问未与值关联的局部变量“form”

问题描述 投票:0回答:3

条件:我有一个模型,在数据库中创建了一个空表,我正在尝试创建一个html表单来填充表中相应列的字段。 这是我的应用程序的样子:

模型.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
python django django-models django-forms django-templates
3个回答
1
投票

这是因为你还没有为

form
方法定义
GET
所以:

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

注意: Django 中的模型都是以单数形式书写的,由于 Django 本身添加了

s
作为后缀,所以最好将模型命名为
City
Route


0
投票

在这里,您为

form = RouteForm(request.POST)
请求传递了
POST
对象,您需要为
GET
请求传递,因此,当使用 GET 请求调用 def
getAbout(request)
函数时,会像这样呈现它...

def getAbout(request):
  form=RouteForm() # <---- called at GET request
  if request.method == 'POST':
    form = RouteForm(request.POST) # <---- called at POST request
    if form.is_valid():
      form.save()
      return redirect("/")
  return render(request, 'routes_form/form_page.html', {'form': form})

0
投票

您需要在views.py中的if条件之前初始化表单

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

from routes_form.forms import RouteForm


def getAbout(request):
    form = RouteForm()
    if request.method == 'POST':
        form = RouteForm(request.POST)
        if form.is_valid():
            form.save()
    return render(request, 'routes_form/form_page.html', {'form': form})
© www.soinside.com 2019 - 2024. All rights reserved.