Не удается заставить 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' %}">
Вернуться на верх