条件:我有一个模型,在数据库中创建了一个空表,我正在尝试创建一个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
这是因为你还没有为
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
在这里,您为
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})
您需要在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})