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