You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模型表单提交验证通过但无法生成SQLite数据表及存储数据的问题求助

Django模型表单提交验证通过但无法生成SQLite数据表及存储数据的问题求助

我正在用Django做一个酒店预订的教学项目,现在遇到了一个头疼的问题:我写了Booking模型和对应的BookingForm模型表单,调试的时候表单验证是通过的,能走到form.is_valid()的分支里,也执行了form.save(),还返回了成功的HttpResponse,但SQLite数据库里始终没生成Booking数据表,后台admin面板里也看不到这个模型。

之前我因为数据验证的问题折腾了一阵,把PhoneNumberField换成了正则验证才搞定表单提交,现在不敢随便改怕又出问题,但数据存不进去真的急死人了。另外还有个小问题,我现在用return HttpResponse()来返回结果,想改成跳转成功页面或者显示提示消息,但一改就报错,也想请教下怎么处理。

我的代码文件内容

models.py

from django.db import models
import datetime
from django.db.models import EmailField
from django.core.validators import EmailValidator, RegexValidator

ROOM_TYPES = [
    ('1', "Single - 200"),
    ('2', "Double - 350"),
    ('3', "Twin - 350"),
    ('4', "Double-Double - 600"),
    ('5', "King Room - 450"),
    ('6', "Luxury - 800")
]

GUESTS_NUMBER = [
    ('1', "1 person. Single comfort room"),
    ('2', "2 people. Recommended Double, Twin or King room"),
    ('3', "3 people. Double-Double or Luxury will match your needs"),
    ('4', "4 people. Double-Double or Luxury will match your needs"),
    ('5', "5 people. Our Luxury room is for you!")
]

STAT = [
    ('0', "Waits for payment"),
    ('1', "Paid")
]

class Booking(models.Model):
    check_in = models.DateField(default=datetime.date.today())
    check_out = models.DateField(default=datetime.date.today())
    room_type = models.CharField(max_length=200, choices=ROOM_TYPES, default=2)
    guests_number = models.CharField(max_length=200, choices=GUESTS_NUMBER, default=2)
    name = models.TextField(max_length=50)
    surname = models.TextField(max_length=100)
    phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
    phone = models.CharField(validators=[phone_regex], max_length=17, blank=True)
    email = EmailField(max_length=254, blank=False, validators=[EmailValidator()])
    payment_status = models.CharField(max_length=200, choices=STAT, default='0')

    def __str__(self):
        return self.surname

forms.py

from app.models import Booking
from django.forms import ModelForm
from django_flatpickr.widgets import DatePickerInput

class BookingForm(ModelForm):
    class Meta:
        model = Booking
        fields = ["check_in", "check_out", "room_type", "guests_number", "name", "surname", "phone", "email", ]
        widgets = {
            "check_in": DatePickerInput(),
            "check_out": DatePickerInput(),
        }

views.py

from django.http import HttpResponse
from django.shortcuts import render
from app.forms import BookingForm

# Create your views here.
def home(request):
    form = BookingForm()
    return render(request, "index.html", {'form': form})

def book(request):
    if request.method == 'POST':
        form = BookingForm(request.POST)
        if form.is_valid():
            new_booking = form.save()
            return HttpResponse('form had gone')
        else:
            return HttpResponse('bad')
    else:
        return render(request, "index.html", {'form': BookingForm()})

index.html 预订部分代码

<section class="page-section" id="contact">
    <div class="container">
        <div class="text-center">
            <h2 class="section-heading text-uppercase">Ready to book?</h2>
            <h3 class="section-subheading text-muted">Select all necessaries, we'll take care of your comfort</h3>
        </div>
        <form method="POST" action={% url 'booking_confirmation' %} class="booking-form">
            {% csrf_token %}
            <div class="container">
                <div class="row">
                    <div class="col-md-6">
                        <div class="calendar-container">
                            <div class="date-fields">
                                <div class="form-group">
                                    <label for="check_in">Check-in Date:</label>
                                    <input type="text" id="check_in" name="check_in" readonly class="form-control">
                                </div>
                                <div class="form-group">
                                    <label for="check_out">Check-out Date:</label>
                                    <input type="text" id="check_out" name="check_out" readonly class="form-control">
                                </div>
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="room_type">Room Type:</label>
                            <select id="room_type" name="room_type" required class="form-control">
                                <option value="1">1 person. Single comfort room</option>
                                <option value="2">2 people. Recommended Double, Twin or King room</option>
                                <option value="3">3 people. Double-Double or Luxury will match your needs</option>
                                <option value="4">4 people. Double-Double or Luxury will match your needs</option>
                                <option value="5">5 people. Our Luxury room is for you!</option>
                            </select>
                        </div>
                        <div class="form-group">
                            <label for="guests_number">Number of people:</label>
                            <select id="guests_number" name="guests_number" required class="form-control">
                                <option value="1">1</option>
                                <option value="2">2</option>
                                <option value="3">3</option>
                                <option value="4">4</option>
                                <option value="5">5</option>
                            </select>
                        </div>
                    </div>
                    <div class="col-md-6">
                        <div class="form-group">
                            <label for="name">Name:</label>
                            <input type="text" id="name" name="name" required class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="surname">Surname:</label>
                            <input type="text" id="surname" name="surname" required class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="phone">Mobile Phone:</label>
                            <input type="tel" id="phone" name="phone" required class="form-control">
                        </div>
                        <div class="form-group">
                            <label for="email">Email:</label>
                            <input type="email" id="email" name="email" required class="form-control">
                        </div>
                    </div>
                    <button style="opacity: 1!important;" class="btn btn-primary btn-xl text-uppercase" id="submitButton" type="submit">Send Message</button>
                </div>
            </div>
        </form>
    </div>
</section>

<!-- JS for flatpickr -->
<script src="https://cdn.jsdelivr.net/npm/flatpickr"></script>
<script>
const checkInField = document.getElementById('check_in');
const checkOutField = document.getElementById('check_out');

flatpickr("#check_in", {
    minDate: "today",
    dateFormat: "Y-m-d",
    onClose: function(selectedDates, dateStr, instance) {
        if (selectedDates.length > 0) {
            const checkInDate = selectedDates[0];
            const adjustedCheckInDate = new Date(checkInDate.getTime() + (24 * 60 * 60 * 1000));
            checkInField.value = adjustedCheckInDate.toISOString().split('T')[0];
            flatpickr("#check_out", {
                minDate: adjustedCheckInDate,
                dateFormat: "Y-m-d",
                onClose: function(selectedDates, dateStr, instance) {
                    if (selectedDates.length > 0) {
                        const checkOutDate = selectedDates[0];
                        const adjustedCheckOutDate = new Date(checkOutDate.getTime() + (24 * 60 * 60 * 1000));
                        checkOutField.value = adjustedCheckOutDate.toISOString().split('T')[0];
                    } else {
                        checkOutField.value = '';
                    }
                }
            });
        } else {
            checkInField.value = '';
            checkOutField.value = '';
        }
    }
});
</script>

我的疑问&需求

  • 表单验证明明通过了,也执行了保存方法,为什么数据库里就是没生成Booking表?admin面板也看不到这个模型,会不会是Django和SQLite的配置有问题?
  • 想把return HttpResponse()换成跳转成功页面或者显示提示消息,但修改后就报错,想知道正确的实现方式
  • 希望能保留当前表单的样式,同时让模型正常生成数据表并存储提交的数据

真的快急死了,有没有大佬能给点靠谱的建议,谢谢了!


备注:内容来源于stack exchange,提问作者Ann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 10:24:32