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
相关产品推荐
相关产品推荐

