试图通过HTML Form,Django创建新对象。 HttpResponse对象。它返回了None

时间:2018-06-03 12:28:47

标签: python html django request modelform

我正在尝试使用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文档的很大一部分,但仍然找不到能帮助我的答案。

1 个答案:

答案 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字段,但不要将其包含在您的模板中。您应该使用表单对象本身来呈现字段,以及错误。再次,所有这些都在文档中。)