[英]Didnt return HttpResponse object. It returned None instead - django
[英]Trying to create new object by HTML Form, Django,. HttpResponse object. It returned None instead
我正在尝试使用HTML表单创建一个新的对象Book,但是我没有HttpResponse。 我在这里发现了几乎相同的情况: 带外键的Django ModelForm,但是我的代码仍然无法正常工作。 我找不到错在哪里。
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)
表格
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文档的大部分内容,但仍然找不到能对我有帮助的答案。
您认为有几个问题,但是最大的问题是,对于表单无效的情况,您没有代码。 您需要在if语句的同一级别(而不是在其中)进行render调用。
同样,成功后您需要重定向,而不是渲染。 最后,您只应设置书籍和作者一次; 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
字段,但不要将其包含在模板中。您应该使用form对象本身来呈现字段以及错误。再次,所有这些都在文档。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.