Попытка создать новый объект с помощью формы HTML, Django ,.HttpResponse объект.Вместо этого он вернулся - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь создать новую объектную книгу, используя форму HTML, но я получаю HttpResponse None.Я нахожу здесь почти такой же случай: 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)

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 голосов
/ 03 июня 2018

У вас есть несколько проблем с вашей точки зрения, но самая большая проблема заключается в том, что у вас нет кода для случая, когда форма недействительна.Вы должны иметь вызов рендеринга на том же уровне, что и оператор 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, но вы не включаете его в свой шаблон.Вы должны использовать сам объект формы для отображения полей, а также ошибок. Еще раз, все это в документации.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...