不会将表单数据存储在django数据库sqlite中

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

我正在尝试为我的 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)

如果有人能发现这个问题,我将不胜感激,奖励最佳答案。谢谢!

我不确定我是否在尝试过一堆组合的任何地方使用了错误的名称

django forms sqlite django-models django-views
1个回答
0
投票

您将表单提交到

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')

注意:最好使用

Form
 [Django-doc] 而不是执行手动验证和数据清理。 A
Form
不会 仅简化了 HTML 中的渲染表单,但也使其更加方便 验证输入,并将数据清理为更方便的类型。


注意:通常最好使用

.create(…)
 [Django-doc] 在数据库中创建记录,而不是实例化模型对象和
.save(…)
 [Django- doc]
它:当你保存模型实例时,它首先查看是否已经有一条记录,因此这会增加数据库的查询次数。


注意:通常你最好使用重定向到的视图的name,这样,Django 可以确定路径,从而减少路径包含错误的可能性,并且如果你更改/移动视图,Django 会自动适应路径。

© www.soinside.com 2019 - 2024. All rights reserved.