Не удается заставить Django ModelForm отображаться и не подключать пользовательскую HTML-форму к базе данных
В настоящее время я создаю приложение на Django, которое представляет собой домашнюю страницу по аренде квартир. Предполагается, что на ней будет форма бронирования, связанная с базой данных. Однако я не могу заставить форму из forms.py отображаться на моей странице bookings.html. Буду благодарен за помощь, так как понятия не имею, какую деталь я упускаю.
Вот мой код:
models.py
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Booking(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_name")
booking_date = models.DateField(auto_now=True)
status = (
('Requested', 'Requested'),
('Confirmed', 'Confirmed'),
('Cancelled', 'Cancelled'),
)
booking_status = models.CharField(choices=status, blank=True, null=True, default='Requested')
first_name = models.CharField(max_length=100, unique=True)
last_name = models.CharField(max_length=100, unique=True)
birth_date = models.DateField()
email = models.EmailField(max_length=100, unique=True)
phone_number = models.BigIntegerField()
address = models.CharField(max_length=200)
zip_code = models.CharField(max_length=100)
city = models.CharField(max_length=100)
country = models.CharField(max_length=100)
booking_object = (
('Upper Apartment', 'Upper Apartment'),
('Lower Apartment', 'Lower Apartment'),
('Whole House', 'Whole House'),
)
booking_item = models.CharField(choices=booking_object)
arrival_date = models.DateField()
departure_date = models.DateField()
guest_nationality = (
('German', 'German'),
('Other', 'Other'),
)
nationality = models.CharField(choices=guest_nationality)
passport_number = models.CharField(max_length=100, blank=True, null=True)
animals = models.BooleanField(blank=True, null=True)
message = models.TextField(max_length=1000)
class Meta:
ordering=['last_name','first_name']
def __str__(self):
return f'Booking: {self.last_name}, {self.first_name}'
forms.py
from django.forms import forms, ModelForm
from .models import Booking
class BookingForm(ModelForm):
class Meta:
model = Booking
fields = ('first_name', 'last_name', 'birth_date', 'email', 'phone_number', 'address', 'zip_code', 'city', 'country', 'booking_item', 'arrival_date', 'departure_date', 'nationality', 'passport_number', 'animals', 'message')
views.py
from django.contrib import messages
from django.http import HttpResponse, HttpRequest, HttpResponseRedirect
from django.shortcuts import render, get_object_or_404, redirect, reverse
from .models import Booking
from .forms import BookingForm
# Booking Form
def book_apartment(request):
if request.method == "POST":
form = BookingForm(request.POST)
if form.is_valid():
form.save()
messages.add_message(request, messages.SUCCESS, "Thank you for booking with us. We will be in touch with you soon.")
return redirect(main_page)
else:
messages.add_message(request, messages.ERROR, "Please fill out all form fields.")
form = BookingForm()
return render(
request,
"{% url 'main-page' %}",
)
booking.html
{% extends "base.html" %}
{% load static %}
{% load crispy_forms_tags %}
{% block content %}
<h1>Booking</h1>
<form id="bookingForm" method="post">
{{ form | crispy }}
{% csrf_token %}
<button id="submitButton" type="submit">Submit</button>
</form>
{% endblock %}
Мой первый подход заключался в попытке подключить пользовательскую html-форму к базе данных:
Я заполняю показанную выше форму, отправляю, страница перезагружается, но введенные данные не отображаются в базе данных.
Другой мой подход заключался в создании формы через forms.py, но и в этом случае на странице booking.html ничего не отображается.
in view you should put form = BookingForm() in a context and make it a dictionary
а для формы в html нужно поставить action вот так:
<form method="your method" action="{% url '#name that you put in url.py for that view you want to answer of form goes in that'%}">
за создание правильного словаря
context = {'#any name': your variable, ...}
и в
return render() after your html page put , and then right context
и после этого ваша форма станет словарем, и вы сможете показать ее на нашей html-странице с помощью
{{ name that you put in your dictionary }}
Чтобы убедиться, что ваша Django ModelForm корректно отображается и обрабатывает отправленные формы, выполните следующие шаги:
views.py
from django.contrib import messages
from django.shortcuts import render, redirect
from .forms import BookingForm
def book_apartment(request):
if request.method == "POST":
form = BookingForm(request.POST)
if form.is_valid():
form.save()
messages.add_message(request, messages.SUCCESS, "Thank you for booking with us. We will be in touch with you soon.")
return redirect('main-page') # Ensure this matches your URL pattern name
else:
messages.add_message(request, messages.ERROR, "Please fill out all form fields.")
else:
form = BookingForm()
return render(request, 'your_template.html', {'form': form}) # Replace 'your_template.html' with your template name
urls.py
path('book-apartment/', views.book_apartment, name='book_apartment'),
В вашем html-файле.
<form method="post" action="{% url 'book_apartment' %}">