我正在尝试为我的 Web 开发课程构建一个 Django 应用程序以完成作业,但我的表单信息不会保存到数据库中。很多代码都是基于他的讲座,所以我不想添加任何库或对此代码进行太多更改。 post 请求在终端中通过,但没有存储任何数据。这是我到目前为止的代码:
views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse, HttpRequest
from . models import Activity
# Create your views here.
def index(request: HttpRequest):
return render(request, "activity/index.html")
def new_activity(request: HttpRequest):
return render(request, "activity/new_activity.html")
def create_new_activity(request: HttpRequest):
params = request.POST
activity = Activity(
activity_name = params.get("activity_name")
)
activity.save()
return redirect("/")
我提交表单的页面 new_activity.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>New Activity</h1>
<form action="/new_activity/" method="post">
<input type="text" name="activity_name" id="activity_name">
<button type="submit">Add Activity</button>
</form>
</body>
</html>
urls.pf
from django.urls import path
from . import views
urlpatterns = [
path("", views.index, name="index"),
path("new_activity/", views.new_activity, name="new_activity"),
]
这是我尝试迁移的模型
from django.db import models
# Create your models here.
class Activity(models.Model):
id = models.BigAutoField(primary_key=True)
activity_name = models.TextField()
class TimeLog(models.Model):
id = models.BigAutoField(primary_key=True)
start_time = models.TimeField()
end_time = models.TimeField()
activity = models.ForeignKey("Activity", on_delete=models.CASCADE)
如果有人能发现这个问题,我将不胜感激,奖励最佳答案。谢谢!
我不确定我是否在尝试过一堆组合的任何地方使用了错误的名称
您将表单提交到
new_activity
视图,因此它不会对数据执行任何操作,而只是重新呈现模板。
向
new_activity
视图添加处理 POST 请求的逻辑:
def new_activity(request: HttpRequest):
if request.method == 'POST':
params = request.POST
activity = Activity.objects.create(
activity_name=params.get('activity_name')
)
return redirect('index')
return render(request, 'activity/new_activity.html')
[Django-doc] 而不是执行手动验证和数据清理。 AForm
不会 仅简化了 HTML 中的渲染表单,但也使其更加方便 验证输入,并将数据清理为更方便的类型。Form
[Django-doc] 在数据库中创建记录,而不是实例化模型对象和.create(…)
[Django- doc]它:当你保存模型实例时,它首先查看是否已经有一条记录,因此这会增加数据库的查询次数。.save(…)
注意:通常你最好使用重定向到的视图的name,这样,Django 可以确定路径,从而减少路径包含错误的可能性,并且如果你更改/移动视图,Django 会自动适应路径。