Почему база данных не заполняется даже после успешного рендеринга и отправки формы в моем приложении django?

Я начинающий django и делаю простую форму регистрации книги для заполнения базы данных sql3. Я думаю, что сделал все правильно, и форма отображается правильно, и при нажатии кнопки submit она даже отправляет POST запрос, но база данных не заполняется. Я исследовал эту проблему все выходные, просмотрел документацию по bootstrap, а также изучил функцию is_valid(). Она выдает ошибку типа "

  • имя_книги
  • Это поле обязательно.
  • ". ". Я не знаю, как с этим бороться и что мне делать? Мой models.py

    from django.db import models
    class Book(models.Model):
        #Create your models here
        book_name = models.CharField(max_length=200)
        page =models.CharField(max_length=20)
        authors =models.CharField(max_length=200)
        registration = models.CharField(max_length=200)
        #email = models.EmailField(max_length=100)
        def __str__(self):
            return self.book_name
    ```
    views.py
    
    ```
    from django.shortcuts import render
    from django.http import HttpResponse
    from . models import Book
    from .forms import BookForm
    def say_hello(request):
        if(request.method=="POST"):
            #if Post request is made :do something
            form = BookForm(request.POST or None)
            if form.is_valid():
                print("New Book Object is created")
                #Book.objects.create(**form.cleaned_data)
                form.save()
            else:
    
                print(form.errors)
                print("Invalid Form data")
    
            return render(request,'join.html',{})
            #Add all things posted to the Bookform
    
        else:
            #otherwise just reder a normal web page
            return render(request,'join.html',{})
    def index(request):
        all_books=Book.objects.all
        return render(request,'index.html',{'all':all_books})
    # Create your views here.
    ```
    
    
    forms.py
    ```
    from django import forms
    from . models import Book
    #To post data to the datbase obtained from form
    class BookForm(forms.ModelForm):
        class Meta:
            model = Book
            fields = ['book_name','authors','page','registration']
    
    ```
        
    
    join.html
    ```
    {%  extends 'base.html' %}<!-- We are including bootstrap loaded base.html file-->
    {% block content %}
    
        <h1>    Register Your Favorite Book
            </h1>
        <p>
        <form method="POST" action="{% url 'hello' %}"> <!-- It says that Call view function respective to 'hello url -->
        {% csrf_token  %} <!-- IT's for security from hacker-->
            <p>
      <div class="form-group">
        <label for="">Book Name</label>
        <input type="text" class="form-control" id="book_name" placeholder="Enter Book Name",name="book_name">
      </div>
      <div class="form-group">
        <label for="authors_name">Authors</label>
        <input type="text" class="form-control" id="author_name" placeholder="Authors' Name" name="authors">
      </div>
             <div class="form-group">
        <label for="Pages">No. Of Pages</label>
        <input type="text" class="form-control" id="page_no" placeholder="No. of Pages" name="page">
                  <div class="form-group">
        <label for="Registration">Registration No</label>
        <input type="text" class="form-control" id="reg_no" placeholder="Book Registration No" name="registration">
      </div>
      </div>
      <button type="submit" class="btn btn-primary">Submit</button>
    </form>
        </p>
        </body>
    {% endblock %}```
    
    
     
    

    Потому что данные формы в шаблоне не совпадают с тем, что ожидает BookForm.

    Чтобы сделать это правильно, вы должны добавить вашу форму как контекст в GET часть:

    else:
        # otherwise just reder a normal web page
        return render(request, 'join.html', {'form': BookForm()})
    

    Затем в шаблоне просто сделайте следующее:

    {{ form }}
    

    Вы можете проверить, какие атрибуты id и name создаются автоматически (которые необходимы позже для BookForm в части POST. Которые вы также должны предоставить. В основном это может выглядеть следующим образом:

    def say_hello(request):
        if request.method == "POST":   # don't use parenthesis for if statement, it's redundant in Python :)
            form = BookForm(request.POST or None)
            if form.is_valid():
                ...
            else:
                ...
        elif request.method == "GET":
            form = BookForm()
            ...
        return render(request, 'join.html', {'form': form})
    
    Вернуться на верх