我正在尝试使用HTML表单创建一个新的对象Book,但我得到了HttpResponse None。 我在这里找到几乎相同的案例:Django ModelForm with foreign key 但我的代码仍然不起作用。我找不到有什么问题。
models.py
class Author(models.Model):
""" Author's class - defines an book's author """
name = models.CharField(max_length=140)
def __str__(self):
return self.name
class Book(models.Model):
""" Book class - defines a book """
title = models.CharField(max_length=140)
author = models.ForeignKey("Author", on_delete=models.CASCADE)
read = models.BooleanField(default=False)
forms.py
class BookForm(forms.ModelForm):
title = forms.CharField(max_length=200)
author = forms.ModelChoiceField(queryset=Author.objects.all())
class Meta:
model = Book
fields = ["title", "author", "read"]
class AuthorForm(forms.ModelForm):
class Meta:
model = Author
fields = ["name"]
books.html
<form class="form-inline my-2 my-lg-0" method="POST">
{% csrf_token %}
<input class="form-control mr-sm-2" type="text" placeholder="Title" aria-label="addbook" name="title">
<input class="form-control mr-sm-2" type="text" placeholder="Author" aria-label="addbook" name="author">
<button class="btn btn-outline-secondary my-2 my-sm-0" type="submit">Add New Book</button>
</form>
views.py
def books(request):
if request.method == 'POST':
form = BookForm(request.POST or None)
if form.is_valid():
form.save(commit=True)
all_books = Book.objects.all
all_authors = Author.objects.all
return render(request, 'books.html', {'all_books': all_books, 'all_authors':all_authors})
else:
all_books = Book.objects.all
all_authors = Author.objects.all
return render(request, 'books.html', {'all_books': all_books, 'all_authors':all_authors})
我想views.py或books.html有问题。 我阅读了Django文档的很大一部分,但仍然找不到能帮助我的答案。
答案 0 :(得分:0)
您的视图中有几个问题,但最大的问题是当表单无效时您没有代码。您需要将渲染调用与if语句放在同一级别,而不是在其中。
此外,您需要在成功后重定向,而不是渲染。最后,你应该只设置一次书籍和作者; all
是一种方法,需要调用它。
def books(request):
if request.method == 'POST':
form = BookForm(request.POST)
if form.is_valid():
form.save()
return redirect('somewhere') # could be back to the same URL
else:
form = BookForm()
all_books = Book.objects.all()
all_authors = Author.objects.all()
return render(request, 'books.html', {'all_books': all_books, 'all_authors':all_authors, 'form': form})
(注意,您的表单可能无效,因为您需要read
字段,但不要将其包含在您的模板中。您应该使用表单对象本身来呈现字段,以及错误。再次,所有这些都在文档中。)