html - 我无法通过表单向数据库添加数据
问题描述
我一直在努力制作一个网站,人们可以在其中发布他们访问过的餐厅的评价。我希望用户通过表单发布数据,但我无法让表单页面像我想象的那样工作。详细地说,表格中的数据不会添加到数据库中。请告诉我为什么系统不工作。我在管理页面和“Tabelog/list.html”的表格中找不到我输入的数据。
名为“form”的函数是试图在页面上显示表单并将数据保存到数据库的函数。
模型.py
from django.db import models
stars = [
(1,"☆"),
(2,"☆☆"),
(3,"☆☆☆"),
(4,"☆☆☆☆"),
(5,"☆☆☆☆☆")
]
# Create your models here.
class Tabelog(models.Model):
store_name = models.CharField("店名",max_length = 124)
evaluation = models.IntegerField("評価",choices = stars)
comment = models.TextField("口コミ")
def outline(self):
return self.comment[:10]
def __str__(self):
return ("{},{},{}".format(self.store_name,self.evaluation,self.comment[:10]))
表格.py
from django import forms
from django.forms import ModelForm
from Tabelog.models import Tabelog
class CreateTabelogForm(forms.ModelForm):
class Meta:
model = Tabelog
fields = "__all__"
网址.py
from django.urls import path,include
from Tabelog import views
app_name = "Tabelog"
urlpatterns = [
path("lp/", views.lp,name="lp"),
path("list/",views.list,name="list"),
path("detail/<str:store_name>",views.detail,name="detail"),
path("form/",views.form,name="form")
]
视图.py
from django.shortcuts import render
from Tabelog.models import Tabelog
from Tabelog.forms import CreateTabelogForm
# Create your views here.
def lp(request):
return render(request,"Tabelog/lp.html")
def list(request):
info = Tabelog.objects.all()
context = {
"info":info,
}
return render(request,"Tabelog/list.html",context)
def detail(request,store_name):
detail = Tabelog.objects.get(store_name = store_name)
context = {
"detail":detail,
}
return render(request,"Tabelog/detail.html",context)
def form(request):
if request.method == "GET":
form = CreateTabelogForm()
context = {
"form":form
}
return render(request,"Tabelog/form.html",context)
else:
form = CreateTabelogForm(request.POST or None)
if request.method == "post" and form.is_valid():
form.save()
return redirect("Tabelog:list")
else:
form = CreateTabelogForm()
context = {
"form":form
}
return render(request,"Tabelog/form.html",context)
base.html
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc+NcPb1dKGj7Sk" crossorigin="anonymous">
<title>Tabelog</title>
</head>
<body>
<div class="container">
<header>
Welcome to Tabelog!
</header>
<main>
{% block content%}
{% endblock %}
</main>
<footer>Thank you for providing information!</footer>
</div>
</body>
</html>
表单.html
<!DOCTYPE html>
{% extends 'Tabelog/base.html' %}
{% block content %}
<form action="" method="post">
{{ form.as_p }}
{% csrf_token %}
<button type="submit">SUBMIT!</button>
</form>
{% endblock %}
列表.html
<!DOCTYPE html>
{% extends 'Tabelog/base.html' %}
{% block content %}
{% for contents in info%}
<article class="store">
<h1> <a href="{% url 'Tabelog:detail' contents.store_name %}">{{contents.store_name}}</a></h1>
<h2>{{contents.get_stars_display}}</h2>
<span>{{contents.outline}}</span>
</article>
{% endfor %}
{% endblock %}
解决方案
我认为这里有一个错字。你用过request.method=="post"
,应该request.method == "POST"
的。老实说,该检查是多余的,因此您应该将其删除。
def form(request):
if request.method == "GET":
form = CreateTabelogForm()
context = {
"form":form
}
return render(request,"Tabelog/form.html",context)
else:
form = CreateTabelogForm(request.POST or None)
if request.method == "post" and form.is_valid():
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# remove this code
该代码的重构版本:
def form(request):
form = CreateTabelogForm(request.POST or None)
if request.method == "POST":
if form.is_valid():
form.save()
return redirect("Tabelog:list")
context = {
"form":form
}
return render(request,"Tabelog/form.html",context)
推荐阅读
- python - 如何在循环中创建页面,tkinter?
- android - 我正在尝试从我的 firebase 中检索数据,但不知何故,时间戳是以 java.util.data 格式接收的
- javascript - 从 html 代码中删除函数和属性
- r - 用 geom_sf 在 R 中绘制等值线图上的点
- swift - 从 Swift 中的 Firebase 登录身份验证中获取错误消息
- routes - TYPO3 如何处理自定义扩展的路由
- pandas - 如果第二个数据帧不存在,则取两个数据帧的差异,同时保留第一个数据帧的值
- python - Discord.py 如何让机器人在特定时间后删除消息
- css - 如何覆盖其他 CSS 样式?
- vue.js - 如何使用 nuxtjs 处理路由器重定向