繁体   English   中英

尝试通过HTML表单Django创建新对象。 HttpResponse对象。 它返回None

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM