首页 > 解决方案 > 我无法通过表单向数据库添加数据

问题描述

我一直在努力制作一个网站,人们可以在其中发布他们访问过的餐厅的评价。我希望用户通过表单发布数据,但我无法让表单页面像我想象的那样工作。详细地说,表格中的数据不会添加到数据库中。请告诉我为什么系统不工作。我在管理页面和“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 %}

标签: htmlpython-3.xdjangodjango-forms

解决方案


我认为这里有一个错字。你用过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)

推荐阅读